gpt4 book ai didi

c# - Entity Framework 5 - 派生类的基于枚举的鉴别器

转载 作者:可可西里 更新时间:2023-11-01 09:05:19 24 4
gpt4 key购买 nike

我有以下内容(为清楚起见进行了缩写)- 一个枚举、一个具有该枚举的基类,以及两个将枚举设置为特定值的派生类。

public enum MyEnum
{
Value1, Value2
}

public class MyBaseClass
{
public MyEnum { get; protected set; }
}

public class DerivedOne: MyBaseClass
{
public DerivedOne { MyEnum = MyEnum.Value1; }
}

public class DerivedTwo: MyBaseClass
{
public DerivedTwo { MyEnum = MyEnum.Value2; }
}

我想要做的是让 Entity Framework 5 自动区分 DerivedOne 和 DerivedTwo,使用基于 MyEnum 值的鉴别器。我应该能够这样做,因为按照惯例,每个 MyEnum == MyEnum.Value1 代表 DerivedOne,而 MyEnum == MyEnum.Value2 代表 DerivedTwo。

我在我的 DbContext 中试过这个:

public class MyDbContext : DbContext
{
DbSet<MyBaseClass> MyBaseClass { get; set; }

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<MyBaseClass>()
.Map<DerivedOne>(m => m.Requires(x => x.MyEnum == MyEnum.Value1));

base.OnModelCreating(modelBuilder);
}
}

但是,这会引发以下 InvalidOperationException:

表达式“x => (Convert(x.MyEnum) == 0)”不是有效的属性表达式。该表达式应表示一个属性 (...)

编辑:我相信我使用这个更进一步了:

modelBuilder.Entity<MyBaseClass>().Map<DerivedOne>(m => m.Requires("MyEnum")
.HasValue((Int32)MyEnum.Value1));

现在我得到这个 EntityCommandCompilationException:

映射从第 (...) 行开始的片段时出现问题,映射的条件成员“MyBaseClass.MyEnum”的条件不是“IsNull=False”。删除 MyBaseClass.MyEnum 上的条件或将其从映射中删除。

关于如何解决这个问题的任何提示?谢谢!

最佳答案

从 EF Core 开始,您可以通过 Fluent API 直接使用枚举。如果您的 MyBaseClass 未映射(是一个抽象类),您可以删除第一行 HasValue 描述基本鉴别器。在您的 ApplicationDbContext 中尝试下一个代码:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<MyBaseClass>()
.HasDiscriminator<MyEnum>("MyEnum")
.HasValue<MyBaseClass>(MyEnum.Value0)
.HasValue<DerivedOne>(MyEnum.Value1)
.HasValue<DerivedTwo>(MyEnum.Value2);
}

关于c# - Entity Framework 5 - 派生类的基于枚举的鉴别器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15859452/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com