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

EF中的可序列化类和动态代理-如何?Share

时间:2023-04-11 11:10:22 C#

EF中的可序列化类和动态代理-怎么样?在[上一篇文章]中,我被设置为必须克隆我的实体的路径。我尝试使用[codeproject]中的序列化方法。因为这些类是由EntityFramework生成的,所以我在我的自定义.cs中单独标记它们,如下所示:[Serializable]publicpartialclassClaims{}然而,当检查时(在克隆方法中):)){被击中,我收到错误:System.ArgumentException未被用户代码处理Message=Thetypemustbeserializable。参数名称:sourceSource=WebParamName=sourceStackTrace:at.Web。C:Users.DocumentsVisualStudio2010Projects.WebsiteExtensions.Object.cs中的Cloner.Clone[T](Tsource):C:Users.DocumentsVisualStudio2010Projects中.Web.Models.Employer..ctor(Useru)的第49行。WebsiteModelsEF.Custom.cs:C:Users.DocumentsVisualStudio2010Projects.WebsiteControllersAuthController.cs中的.Web.Controllers.AuthController.Register(StringCompany,StringGivenName,StringSurname,StringTitle,StringDepartment)的第121行:lambda_method的第119行(Closure,ControllerBase,Object[])在System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase控制器,Object[]参数)在System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContextcontrollerContext,IDictionary`2参数)在System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContextcontrollerContext,ActionDescriptoractionDescriptor,IDictionary`2参数)在System.Web.Mvc.ControllerActionInvoker.bat__Display1.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilterfilter,ActionExecutingContextpreContext,Func`1continuation)InnerException:显然,虽然我的类Claims是可序列化的,但EF生成的动态代理不是......不知何故,我的装饰没有流过这里的技巧是什么然而?*更新I*更多上下文:我有一个User类,其中包含定义为ICollection的属性Claims。克隆时,传递的类型是Collection,而不是Claim——这解释了为什么克隆者抱怨该类型不可序列化。现在的问题是:如何使User.Claims可序列化,因为我不能修饰属性?错误1??属性“Serializable”在此声明类型上无效。它仅对“类、结构、枚举、委托”声明有效。C:Users.DocumentsVisualStudio2010Projects.WebsiteModelsEF.Custom.cs12810Website*UpdateII*练习的目的是设置深拷贝。这就是它的样子:publicpartialclassEmployer{publicEmployer(Useru){this.Id=u.Id;this.GivenName=u.GivenName;this.Surname=u.Surname;this.Claims=u.Claims.克隆();this.Contacts=u.Contacts.Clone();}}为了使u.Claims.Clone()工作,u.Claims必须是可序列化的,但不是出于上述原因。*更新III*好的,我改变了方法并实现了这样的构造函数:publicpartialclassEmployer{publicEmployer(Useru){this.Id=u.Id;this.GivenName=u.GivenName;this.Surname=u.Surname;ICollectioncs=newList();foreach(在u.Claims中声明c){cs.Add(c.Clone());}this.Claims=cs;现在它绕过了clone()检查(上面的“if”行),但现在它在:formatter.Serialize(stream,source);有:System.Runtime.Serialization.SerializationExceptionwasunhandledbyusercodeMessage=Type'System.Data.Entity.DynamicProxies.User_7B7AFFFE306AB2E39C07D91CC157792F503F36DFCAB490FB3333A52EA1D5DC0D'inAssembly'EntityFrameworkDynamicProxies-Web,Version=0neut.Web,Version=1.0,Culture=1.0未标记为可序列化。Source=mscorlibStackTrace:在System.Runtime.Serialization.FormatterServices.InternalGetSerializableMembers(RuntimeType.type)在SystemRuntime.Serialization.FormatterServices.GetSerializableMembers(类型类型,StreamingContext上下文)ry.WriteObjectInfo.InitMemberInfo()在System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitSerialize(Objectobj,ISurrogateSelectorsurrogateSelector,StreamingContextcontext,SerObjectInfoInitserObjectInfoInit,IFormatterConverterconverter,ObjectWriterobjectWriter,SerializationBinderbinder)在System.Runtime.Serialization。System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Serialize(对象图,Header[]inHeaders,__BinaryWriterserWriter,BooleanfCheck)在System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(StreamserializationStream,Objectgraph,Header[]headers,BooleanfCheck)在System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(StreamserializationStream,Objectgraph)在Skillscore.WebC:Users.DocumentsVisualStudio201中的.Cloner.Clone[T](T源)0Projects.WebsiteExtensions.Object.cs:C:Users.DocumentsVisualStudio2010Projects.WebsiteModelsEF.Custom.cs:line130Sigh...一切都这么难吗??*更新IV*好的,所以上面的问题是Claim类有一个指向User的导航器-这解释了为什么上面的方法说类型是.User_[...]并且暗示我不仅需要使向下依赖可序列化,并且所有路径都已备份!然而,这样做我成功地克隆了对象,但我现在回到了原始帖子中的问题:System.InvalidOperationExceptionwasunhandledbyusercodeMessage=Conflictingchangestotherole'User'oftherelationship'EF.ClaimUser'已检测到.Source=System.Data.EntityStackTrace:在System.Data.Objects.DataClasses.RelatedEnd.IncludeEntity(IEntityWrapperwrappedEntity,BooleanaddRelationshipAsUnchanged,BooleandoAttach)在System.Data.Objects.DataClasses.EntityCollection`1.Include(布尔addRelationshipAsUnchanged,布尔doAttach)在System.Data.Objects.DataClasses.EntityCollection`1.Include(布尔addRelationshipAsUnchanged布尔doAttach)在System.Data.Objects.DataClasses.RelationshipManager.AddRelatedEntitiesToObjectStateManager(布尔doAttach)在System.Data.Objects.ObjectContext.AddObjectt(StringentitySetName,Objectentity)在System.Data.Entity.Internal.Linq.InternalSet`1.c__DisplayClass5.b__4()在System.Data.Entity.Internal.Linq.InternalSet`1.ActOnSet(Actionaction,EntityStatenewState,对象实体,字符串方法名称)在System.Data.Entity.Internal.Linq.InternalSet`1.Add(对象实体)在System.Data.Entity.DbSet`1.Add(TEntity实体)在Skillscore.Web.Controllers。AuthController.Register(StringCompany,StringGivenName,StringSurname,StringTitle,StringDepartment)在C:Users.DocumentsVisualStudio2010Projects.WebsiteControllersAuthController.cs:line138男人我需要一个洞。*UpdateV*不知道是proxying还是lazyloading的问题,稍微想了想,似乎如果我通过序列化clone的话,以前属于旧对象的所有东西的ID现在都是将属于新的。我确实首先对旧对象执行了.remove(),如果它立即生效,跟踪中的某些东西可能不知道它。如果没有,那么在某个时候会有两个具有相同ID的东西......所以我开始倾向于@Jockey的想法,即使用对象初始化器进行克隆......如果你想序列化实体,您可以在检索该对象之前禁用代理创建。如果要序列化导航属性,还需要加载导航属性。在EF4.1dbContext.Configuration.ProxyCreationEnabled=false中禁用代理创建;在EF4objectContext.ContextOptions.ProxyCreationEnabled=false;例如:varusers=context.Users.Include("Claims").Where(/**/);查看实体框架的T4模板,您可以控制EF如何生成实体,您必须在T4模板中将它们定义为可序列化。关闭延迟加载并关闭代理类创建。不管怎样,您仍然需要添加Serializable/DataContract属性以使其可序列化。我在使用EntityFramework6(EF6)时遇到了同样的问题。我通过更改T4模板并在UsingDirectives和EntityClassOpening行之间添加[Serializable]行来修复此问题。像这样:[Serializable]不需要其他更改。以上就是C#学习教程:SerializableclassesanddynamicproxiesinEF-how?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: