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

实体框架代码优先方法中的映射字典分享

时间:2023-04-10 20:22:25 C#

实体框架代码优先方法中的映射字典//////休假权利详细信息。公共字典LeaveEntitlementDetails{get;放;我想将其映射到数据库。是否可以使用受保护或私有列表?如://////获取休假权利详细信息。//////休假权利详细信息。公共字典LeaveEntitlementDetails{get;放;}publicListLeveEntitlementStore{get{ListleaveEntitlements=newList();foreach(LeaveEntitlementDetails中的KeyValuePairleaveType){leaveEntitlements.Add(leaveType.Value);}返回leaveEntitlements;}set{foreach(EmployeeLeaveEntitlementiteminvalue){this.LeaveEntitlementDetails.Add(item.LeaveType,item);?实体框架目前不支持本地映射字典。有关详细信息和解决方法,请参阅以下内容:实体框架4POCO与字典EFCodeFirst-将字典或自定义类型映射为nvarcharhttp://social.msdn.microsoft.com/Forums/en-US/adonetefx/thread/a51ba903-2b8b-448e-8677-d140a0b43e89/usingXMLcolumninDB所以今天我遇到了同样的问题,经过思考我找到了一个很酷的解决方案,即使我迟到了,也想与社区分享。基本上我已经创建了一个包装系统,将字典的数据作为XML列保存到数据库中,因此稍后我还可以根据需要从数据库中查询XML。Pro这个方法首先,这里是我所有模型的骨架:publicabstractclassBaseEntity{//////模型的ID///publicintID{get;String属性,包含XML中字典序列化和反序列化的逻辑,如下代码片段:publicclassMyCoolModel:Base.BaseEntity{//////包含属性的XML数据///publicstringAttributesData{get{varxElem=newXElement("items",Attributes.Select(x=>newXElement("item",newXAttribute("key",x.Key),newXAttribute("value",x.Value))));返回xElem.ToString();}set{varxElem=XElement.Parse(value);vardict=xElem.Descendants("item").ToDictionary(x=>(string)x.Attribute("key"),x=>(string)x.Attribute("value"));属性=字典;}}//一些其他的东西//////一些很酷的描述///[NotMapped]publicDictionaryAttributes{get;放;然后我实现了一个BaseMapping类,它来自EntityTypeConfigurationclassBaseMapping:EntityTypeConfigurationwhereTEntity:Model.Base.BaseEntity{publicBaseMapping(){//一些基本的mapping逻辑,我想对我的所有模型实现}}以及在MyCoolModel的自定义映射MyCoolModel类MyCoolModelMapping中:BaseMapping{publicMyCoolModelMapping(){Property(r=>r.AttributesData).HasColumnType("xml");现在请注意,当EntityFramework请求AttributesData值时,它只是序列化字典,当我从数据库中检索数据并且EntityFramework将数据设置为一个字段,然后反序列化该字段并将其设置为dict时,也会发生同样的情况,最后我覆盖了我的DbContext的OnModelCreating保护覆盖voidOnModelCreating(DbModelBuildermodelBuilder){base.OnModelCreating(modelBuilder);modelBuilder.Configurations.Add(newMappings.BaseMapping());modelBuilder.Configurations.Add(newMappings.MyCoolModelMapping());//其他逻辑}就是这样!现在我可以在业务逻辑中使用字典,这个“包装器”处理将数据保存到数据库并从中检索数据所需的一切。我在EF中遇到了类似的问题,我想将查询返回列表转换为相当于类属性的字典。与您希望LeaveEntitlementDetails包装LeveEntitlementStore的方式非常相似,例如:classA{[NotMapped()]publicDictionaryData{get;set}//指Data.ValuespublicICollectionDataAsList{get;我希望DataAsList基本上包装Data.Values经过大量的反复试验,我发现EF,对于集合(可能更多),通过getter(而不是setter)的返回值进行更改。即从我的数据库初始化时:varpollquery=FrombbInDBM.Dbi.DataTable.Includes("DataAsList")Wherebb.Id=idSelectbb;ClassAobjInstance=pollquery.First();永远不会调用ClassA。DataAsList的setter,但是在我的对象的内部构造期间的getter...结论:EF使用从属性ClassA.DataAsList的getter检索到的引用,并将对象添加到它。因此,我将getter的DataAsList返回值包含在ObservableCollection中,并为CollectionChangedargs添加了一个处理程序,果然,我的CollectionChanged处理程序接收了.Add调用。所以继承我的hackaround-aroundaround:classA:INotifyPropertyChanged{//所以我们可以让EF知道一个复杂的属性已经改变publiceventPropertyChangedEventHandlerINotifyPropertyChanged.PropertyChanged;//这是我们的实际数据,而不是自动属性,我们使用显式成员定义,因此我们可以在数据更改时调用PropertyChangedprivateDictionarym_data=newDictionary();//未映射属性,因为它未映射到EFDB[NotMapped()]中的列publicDictionaryData{get{returnm_data;}设置{m_data=值;//现在为我们的Front调用PropertyChanged(因此EF将知道它已被更改)}}}//这是我们的数据前端,我们在EF中使用它来将数据映射到[DebuggerHidden()]publicICollectionDataAsList{get{ObservableCollectionob=newObservableCollection(Data.Values());ob.CollectionChanged+=Handles_entry列表已更改;返回对象;}set{//清除任何现有数据,因为EF正在尝试设置集合值Data.Clear();//在我的情况下,这就是我将对象从内部obj.Id属性转换为字典的方式}}}//这将捕捉到EF试图对我们的DataAsList属性进行的任何更改publicvoidHandles_entryListChanged(objectsender,NotifyCollectionChangedEventArgse){//Debugger.Break()switch(e.Action){caseNotifyCollectionChangedAction.Add:foreach(e.NewItems中的数据类型条目){m_data.Add(entry.Id,entry);}休息;默认值:Debugger.Break();休息;}}}注意魔法是:publicICollectionDataAsList{get{ObservableCollectionob=newObservableCollection(Data.Values());ob.CollectionChanged+=Handles_entryListChanged;返回对象;我们订阅以返回对列表所做的任何更改,以及我们处理的Handles_entryListChanged,并基本上复制所做的任何更改以上就是C#学习教程:实体框架代码第一个方法中映射字典分享的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文来自网络收集,不代表作品如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处: