我有以下内容(为清楚起见,已缩写):一个枚举,带有该枚举的基类,以及两个将枚举设置为特定值的派生类。
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通过基于MyEnum值的区分符自动区分DerivedOne和DerivedTwo 。我应该能够做到这一点,因为按照惯例,每个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上的条件或将其从映射中删除。
关于如何解决此问题的任何提示?谢谢!
最佳答案
据我所知,你不能那样做。进行明确的Requires
来指定区分符只是给它一个name
-而不是将其连接到您的媒体资源。
据我所知,这总是会导致您所描述的错误(以后)。如果要指定鉴别符,它必须是“自动的”一个(至少我从来没有设法这样定义它)
但是您不需要真正的。 “枚举”和鉴别符是您返回的类型的built into
-基于鉴别符值,EF/CF正在构造“Base”或“DerivedOne”或DerivedTwo。
因此,要实现您想要的功能,您可以执行以下操作...
public class MyBaseClass
{
[NotMapped()]
public virtual MyEnum MyEnum { get { return MyEnum.Base; } }
}
public class DerivedOne: MyBaseClass
{
public string OneProp { get; set; }
public override MyEnum MyEnum { get { return MyEnum.One; } }
}
public class DerivedTwo: MyBaseClass
{
public string TwoProp { get; set; }
public override MyEnum MyEnum { get { return MyEnum.Two; } }
}
或者只是改用
is
(如果它对您有用)...if (entity is MyBaseClass) // instead of enum
或查询依据...
.OfType<MyBaseClass>();
关于c# - Entity Framework 5-派生类的基于枚举的区分符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15859452/