asp.net-mvc-3 – 使用JSON.Net序列化EF4.1实体
我正在使用MVC3,Razor视图引擎,使用工作单元的存储库模式构建应用程序,并使用EF4.1 Code First来定义我的数据模型.
这里有一些背景(如果你想要的话就会有光泽). 应用程序本身只是一个Intranet“菜单”. 2个主要实体是MenuItem和Department,其中: > MenuItem可以有许多部门 这就是我定义我的实体的方式 public class MenuItem { public int MenuItemId { get; set; } public string Name { get; set; } public string Url { get; set; } public virtual ICollection<Department> Departments { get; set; } public int? ParentId { get; set; } public virtual MenuItem ParentMenuItem { get; set; } } public class Department { public int DepartmentId { get; set; } public string Name { get; set; } public virtual ICollection<MenuItem> MenuItems { get; set; } } 我正在使用FluentAPI为MenuItem定义多对多的自引用. 我遇到的问题是通过JSON将MenuItem传递给视图. 我使用Nuget的JSON.net库作为我的JSON Serializer,因为这似乎是循环引用问题的一个很好的方法.我现在不确定如何“修复”代理生成问题.目前序列化程序抛出RelationshipManager对象无法序列化.当RelationshipManager属于未实现IEntityWithRelationships的实体对象时,无法序列化此类对象. 谁能帮我这个?如果我关闭代理生成,我将有一段时间加载所有的MenuItem孩子,所以我很想留下这个.我已经阅读了相当多的数据,似乎有各种不同的答案,包括将实体投影到另一个对象并序列化等等.理想情况下,有一些方法可以配置JSON.net来忽略RelationshipManager对象? 更新 这是我用作JSON.Net序列化程序的Custom ContractResolver的内容.这似乎解决了我的问题. public class ContractResolver : DefaultContractResolver { private static readonly IEnumerable<Type> Types = GetEntityTypes(); private static IEnumerable<Type> GetEntityTypes() { var assembly = Assembly.GetAssembly(typeof (IEntity)); var types = assembly.GetTypes().Where(t => String.Equals(t.Namespace,"Namespace",StringComparison.Ordinal)); return types; } protected override List<MemberInfo> GetSerializableMembers(Type objectType) { if (!AllowType(objectType)) return new List<MemberInfo>(); var members = base.GetSerializableMembers(objectType); members.RemoveAll(memberInfo => (IsMemberEntityWrapper(memberInfo))); return members; } private static bool AllowType(Type objectType) { return Types.Contains(objectType) || Types.Contains(objectType.BaseType); } private static bool IsMemberEntityWrapper(MemberInfo memberInfo) { return memberInfo.Name == "_entityWrapper"; } } IEntity是我的所有Code First实体对象实现的接口. 解决方法
好吧,你使用强大的序列化API来序列化引用和所有成员,现在你抱怨它序列化所有成员:)
我没有测试它,但我相信这会让你接近解决方案. JSON.NET是一个非常强大的工具,它应该为您提供可扩展性,以避免这种行为,但您必须自己编写代码.您将需要自定义DataContractResolver,您可以在其中定义应序列化的成员. Here是NHibernate的类似示例. 您可以实现一些逻辑,这些逻辑仅包含动态代理的父类中的成员.我希望这不会破坏延迟加载.要验证当前实体是否为代理,您可以使用此代码获取所有已知代理类型: IEnumerable<Type> types = ((IObjectContextAdapter)dbContext).ObjectContext.GetKnownProxyTypes(); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- C#、Python中分别是怎么实现通过字符串获取实体类的值以及给
- AspNetCore.Identity详解2——注册用户
- asp.net-mvc – SignalR无法从外部程序集中找到集线器
- asp.net-core – Asp.net Core中的Web应用程序与Web Api项目
- asp.net-web-api – 使用WebAPI和RavenDB进行基本会话处理
- asp.net – 动态设置超链接控件的navigationurl属性内联
- asp.net-mvc-4 – 文本框中mvc中的Textchanged事件
- ASP.NET Core缓存静态资源
- DELETE语句与ASP.NET动态数据中的REFERENCE约束冲突
- asp.net – .resx vs数据库vs用于提供本地化/全球化的自定义
- 在asp.net中使用绑定表达式时,如何连接文本?
- asp.net-mvc – Html.HiddenFor值属性未设置
- asp.net – 如何更改AjaxControlToolkit HtmlEdi
- ASP.NET MVC AJAX文档在哪里?
- asp.net-mvc – 用于创建具有模型和ViewData项目
- rest – 基于权限从WebApi端点进行上下文序列化
- asp.net-mvc – 在数据库表中存储用户筛选查询参
- asp.net-mvc – 将EF 4.1代码首先将ASP.NET MVC3
- asp.net – .Net Core 2.0 – 获取AAD访问令牌以
- asp.net-mvc – 使用ASP.NET MVC响应HTTP HEAD请