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

将entity framework中的字符串列映射到枚举分享

时间:2023-04-10 13:40:53 C#

C#学习教程:将实体框架中的字符串列映射为枚举我已经在Hibernate中完成了此操作,但无法在EMF中弄清楚。它很难看,但是为了将枚举映射到字符串,我发现了这样的东西:publicvirtualstringStatusString{get{returnStatus.ToString();}设置{OrderStatusnewValue;if(Enum.TryParse(value,outnewValue)){Status=newValue;}}}publicvirtualOrderStatusStatus{get;放;}OrderStatus是一个枚举类型,Status是一个枚举,StatusString是它的字符串版本。可能是更好的版本。OrderStateIdentifier字段用于JSON序列化和数据库字段,而OrderState只是为了方便在代码中使用。公共字符串OrderStateIdentifier{获取{返回OrderState.ToString();}设置{OrderState=value.ToEnum();}}[NotMapped][JsonIgnore]publicOrderStateOrderState{get;放;}publicstaticclassEnumHelper{/////将字符串转换为枚举值(与Enum.ToString()相反)。//////将字符串转换成的枚举类型。///要转换为枚举值的字符串。publicstaticTToEnum(thisstrings)whereT:struct{TnewValue;返回枚举。TryParse(s,outnewValue)?新值:默认(T);我认为还有另一种解决方案。我们最近在项目中一直在做的是使用扩展方法。我写了两个,一个用于Enum,一个用于Entity,但这里是示例:现在包含静态类的扩展方法:publicstaticclassAccountStatusExtensionMethods{//////返回Type作为db实体的枚举//////要检查其类型的实体///代表public类型的枚举静态EAccountStatusGetAccountStatus(此帐户实体){如果(entity.AccountStatus.Equals(EAccountStatus.Offline)){returnEAccountStatus.Offline;}elseif(entity.AccountStatus.Equals(EAccountStatus.Online)){返回EAccountStatus。在线的;}elseif(entity.AccountStatus.Equals(EAccountStatus.Pending)){returnEAccountStatus.Pending;}thrownewSystem.Data.Entity.Validation.DbEntityValidationException(“设置了无法识别的AccountStatus,这是致命的!”);}...实体类型的扩展方法,以及缩短输入的便捷方法://////获取此枚举选择的字符串表示形式//////所选枚举的实例///字符串表示中所选枚举的名称publicstaticStringGetName(thisEAccountStatuse){returnEnum.GetName(typeof(EAccountStatus),e);}}}...最终用法://设置始终相同的可映射字符串:db.AccountSet.Single(m=>m.Id==1).Status=EAccountStatus.Online.GetName();//从您看到的实际实体中获取枚举:EAccountStatusactualStatus=db.AccountSet.Single(m=>m.Id==1).GetAccountStatus();现在,您只需要“使用Foo.Enums;”并且您可以在实体和枚举上调用方法更好的是,在某些实体的包装器中,您还可以在较大项目中表示相同事物的不同类型之间进行无缝编组。唯一值得注意的是,有时必须先执行扩展方法,然后才能将Linq表达式传递给Linq。这里的问题是Linq不能在它自己的上下文中执行扩展方法……也许只是一种替代方法,但我们已经做到了,因为它为您提供了很大的灵活性,可以让您在如何为您的实体获取东西方面。您可以轻松地编写一个扩展来接收ShoppingCart中的帐户实际产品...您好,Kjellski另一种方法是使用带有字符串常量字段而不是枚举的静态类。例如:publicclassPocoEntity{publicstringStatus{get;放;}}publicstaticclassPocoEntityStatus{publicconststringOk="ok";publicconststringFailed="failed";要在数据库端添加验证,您可以添加一个检查约束来验证该列是否为预期值(映射到枚举时也可以这样做,但由于该属性只是一个字符串,这有助于确保您的消费者api正确设置值)。ALTERTABLE[PocoEntity]添加约束[CHK_PocoEntity_Status]CHECK([Status]in('ok','failed'));它在EF7的路线图上:https://github.com/aspnet/EntityFramework/issues/242你可能想投票给它:http://data.uservoice.com/forums/72025-entity-framework-feature-suggestions/suggestions/2639292-simple-type-mapping-or-mapped-type-conversion-sup我有同样的问题。我想出了一个解决方案,但我并不完全满意。我的Person类有一个Gender枚举,我使用数据注释将字符串映射到数据库并忽略枚举。publicclassPerson{publicintPersonID{get;放;}publicstringFirstName{get;放;}publicstringLastName{get;放;}[Column("Gender")]publicstringGenderString{get{returnGender.ToString();}privateset{Gender=EnumExtensions.ParseEnum(value);}}[NotMapped]publicGender性别{get;放;这是从字符串中获取正确枚举的扩展方法。publicclassEnumExtensions{publicstaticTParseEnum(stringvalue){return(T)Enum.Parse(typeof(T),value,true);我写了一篇关于这个的博客文章——http://nodogmablog。bryanhogan.net/2014/11/saving-enums-as-strings-with-entity-framework/如果想将一个枚举值映射到另一个对应的字符串(比如缩写),可以使用下面的方法:上面是C#学习教程:将实体框架中的字符串列映射到枚举分享的全部内容。如果对大家有用,需要了解更多C#学习教程,希望大家多多关注——publicclassMinhaClasse{publicstringCodTipoCampo{get;放;}[NotMapped]publicTipoDadoTipoCampo{get=>DictValorTipoDado.SingleOrDefault(e=>e.Value==CodTipoCampo).Key;设置=>CodTipoCampo=DictValorTipoDado[值];}privateDictionaryDictValorTipoDado=newDictionary(){{TipoDado.Texto,"T"},{TipoDado.Numerico,"N"},{TipoDado.Data,"D"}};publicenumTipoDado{Texto,Numero,Data}}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: