当前位置: 首页 > 编程语言 > C#

entityframework5-DiscriminatorforEnum-BasedDerivedClassShare

时间:2023-04-10 18:57:50 C#

entityframework5-DiscriminatorforEnum-BasedDerivedClass我有以下(为清楚起见缩写)-一个枚举,一个和有一个基类为枚举,以及两个将枚举设置为特定值的派生类。publicenumMyEnum{Value1,Value2}publicclassMyBaseClass{publicMyEnum{get;保护集;}}publicclassDerivedOne:MyBaseClass{publicDerivedOne{MyEnum=MyEnum.Value1;我的枚举.Value2;我想要做的是让EntityFramework5自动区分DerivedOne和DerivedTwo,并使用基于MyEnum值的鉴别器。我应该能够做到这一点,按照惯例,每个MyEnum==MyEnum.Value1代表DerivedOne而MyEnum==MyEnum.Value2代表DerivedTwo。我在我的DbContext中试过这个:publicclassMyDbContext:DbContext{DbSetMyBaseClass{get;放;}protectedoverridevoidOnModelCreating(DbModelBuildermodelBuilder){modelBuilder.Entity().Map(m=>m.Requires(x=>x.MyEnum==MyEnum.Value1));base.OnModelCreating(模型构建器);但是,这会引发以下InvalidOperationException:表达式“x=>(Convert(x.MyEnum)==0)”不是有效的属性表达式。表达式应该代表属性(...)值1));现在我得到这个EntityCommandCompilationException:问题映射片段从行开始(...)映射条件成员“MyBaseClass.MyEnum”,其条件不是“IsNull=False”。删除MyBaseClass.MyEnum上的条件或将其从地图中删除。关于如何解决这个问题的任何提示?谢谢!据我所知你不能那样做。做一个明确的Requires说明符只是给它一个名字-而不是将它连接到你的财产。据我所知,总是会导致您描述的错误(稍后)。如果你想指定鉴别器,它必须是“自动的”(至少我从来没有设法定义它)但你真的不需要这样做。“枚举”和鉴别器内置于您获得的类型中-根据鉴别器值,EF/CF构建“Base”或“DerivedOne”或DerivedTwo。因此,要实现您想要的,您可以执行以下操作...publicclassMyBaseClass{[NotMapped()]publicvirtualMyEnumMyEnum{get{returnMyEnum.Base;}}}publicclassDerivedOne:MyBaseClass{publicstringOneProp{get;放;}publicoverrideMyEnumMyEnum{get{returnMyEnum.One;}}}publicclassDerivedTwo:MyBaseClass{publicstringTwoProp{get;放;}publicoverrideMyEnumMyEnum{get{returnMyEnum.Two;}}}或Justuseis(ifitworksforyou)...if(entityisMyBaseClass)//而不是枚举或查询....OfType();从EF6.1开始,我实际上能够使用枚举作为鉴别器列,尽管存在以下错误:附加信息:“MyEnum”类型的值不能用作类型鉴别器值。支持的类型包括byte、signedbyte、bool、int16、int32、int64和string。我要做的就是这样:publicenumMyEnum{Value1,Value2}publicclassMyBaseClass{publicMyEnum{get;保护集;}}publicclassDerivedOne:MyBaseClass{publicDerivedOne(){MyEnum=MyEnum.Value1;}}publicclassDerivedTwo:MyBaseClass{publicDerivedTwo(){MyEnum=MyEnum.Value2;}}publicclassMyDbContext:DbContext{DbSetMyBaseClass{get;放;}protectedoverridevoidOnModelCreating(DbModelBuildermodelBuilder){modelBuilder.Configurations.Add(newDerivedOneConfiguration()).Add(newDerivedTwoConfiguration());}}publicclassDerivedOneConfiguration:EntityTypeConfiguration{publicDerivedOneConfiguration(){Map(_=>_.Requires("MyEnum").HasValue((int)MyEnum.Value1).IsRequired());}}publicclassDerivedTwoConfiguration:EntityTypeConfiguration{publicDerivedTwoConfiguration(){Map(_=>_.Requires("MyEnum").HasValue((int)MyEnum.Value2).IsRequired());}}所以秘密是使用(int)MyEnum.Value*而不是MyEnum.Value*…基于@rsenna的答案,但具有基于Microsoft的FluentApi原始文档的更新映射https://msdn.microsoft.com/en-us/library/jj591617%28v=vs.113%29.aspx?f=255&MSPPError=-2147217396以上是C#学习教程:entityframework5-基于枚举派生类如果判别器分享的所有内容对你有用,需要进一步了解C#学习教程,希望你多多关注——publicenumMyEnum{Value1,Value2}publicclassMyBaseClass{[NotMapped]publicMyEnum我的枚举{得到;保护集;}}publicclassDerivedOne:MyBaseClass{publicDerivedOne(){MyEnum=MyEnum。价值1;}}publicclassDerivedTwo:MyBaseClass{publicDerivedTwo(){MyEnum=MyEnum.值2;{得到;放;}protectedoverridevoidOnModelCreating(DbModelBuildermodelBuilder){base.OnModelCreating(modelBuilder);modelBuilder.Entity().Map(x=>x.Requires("MyEnum").HasValue((int)MyEnum.Value1)).Map(x=>x.Requires("MyEnum").HasValue((int)我的枚举值2));}}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: