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

使用EF和WebApi序列化父-子对象分享

时间:2023-04-10 16:44:30 C#

使用EF和WebApi序列化父/子对象我在实体框架中有以下模型:{得到;放;现在我尝试使用webapi对其进行序列化:publicclassCustomerController:ApiController{publicHttpResponseMessageGetAll(){using(vartc=newDataContext()){返回Request.CreateResponse(HttpStatusCode.OK,allCustomers);当我执行此操作并使用POST调用方法时,出现以下错误:类型“ObjectContent`1”无法序列化内容类型“application/json”的响应主体;charset=utf-8'InnerException:"Errorgettingvaluefrom'Childrenon'System.Data.Entity.DynamicProxies.Customer'InnerException(2):"ObjectContext实例已被处理,不能再用于需要connection."customers.Children目前是一个空列表。我猜测问题的出现是因为child与customer属于同一类型,导致“无限序列化循环”。(我没有更好的词来描述)我试过XmlIgnore来防止属性被序列化但无济于事。不要将导航属性声明为虚拟或禁用延迟加载行为。默认情况下启用延迟加载,方法是创建派生代理类型的实例,然后覆盖添加加载挂钩的虚拟属性。所以如果你想使用XML序列化器,我建议关闭延迟加载:publicclassYourContext:DbContext{publicYourContext(){this.Configuration.LazyLoadingEnabled=false;如果你想加载相关实体(Children),你可以使用Include扩展方法作为查询的一部分。这种行为称为预加载。使用System.Data.Entity;//对于扩展方法`Include`ListallCustomers=tc.Customers.Include(c=>c.Children).ToList();这些链接可以帮助您更好地理解我在回答中解释的内容内容:如果您从导航属性中删除虚拟关键字,则POCO实体不符合第二个链接中描述的要求,因此,EF不会创建代理类延迟加载导航属性。但是,如果禁用延迟加载,即使导航属性是虚拟的,也不会在任何实体中加载它们。使用序列化程序时禁用延迟加载是个好主意。大多数序列化程序通过访问类型实例上的每个属性来工作。仅供参考:以下内容也适用:publicclassCustomer{[XmlIgnore,JSonIgnore]publicvirtualICollectionChildren{get;放;}公共字符串名称{得到;放;神奇的是那里的“JsonIgnore”。尽管如此:@octavioccl的回答是一个更好的解决方案,需要更多的工作,但会创建更好的代码。以上就是C#学习教程:使用EF和WebApi序列化parent/child对象,分享全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: