由于大部分是我去过的人的序列化(可怕的)EF对象JSON的时候也遇到了循环引用错误的问题。 这样做db.Detach(efObject)帮助 - 但我仍然得到像垃圾“的EntityKey”输出。
所以我在想,如果有一个选项(通过JsConfig?)告诉串行忽略属性既可以通过名称(的EntityKey),或者通过类型(的EntityReference <T>或EntityCollection <T>)?
或将我不得不产品总数沟EF并切换到更好的东西(我不想手动定义ORM类 - 我希望他们从数据库自动生成)?
你不应该试图重新使用实体框架类型的DTO的 ,因为它们是由DTO的设计不良的替代品。 你应该使用他们ServiceStack的内置TranslateTo / PopulateFrom映射器(或AutoMapper),而不是映射到特殊目的DTO类型和返回的。
随着中说,使用IgnoreDataMember或指定数据成员 ,你想序列化的属性。
免责声明:我目前在做原型和我方便更重要比的解决方案的鲁棒性。 所以,我所做的是不是一个很好的路要走-我在这里复制粘贴以防万一别人是在相同的位置,并希望有一个简单的(不是最好的)的出路。 你已经被警告。
我相信你已经在你的MVC项目中使用ServiceStack.Text。 如果不是这种情况,请从这个QA说明: ASP.NET MVC Json的日期时间序列化转换为UTC
看看从GitHub ServiceStack.Text库 (当然)引用它在你的MVC项目,而不是DLL和。
这种加入ServiceStack.Text / JsConfig类:
// Added properties for global excluding public static Type[] GlobalExcludedBaseTypes; public static string[] GlobalExcludedProperties;
更改ServiceStack.Text / TypeConfig类的静态TypeConfig():
static TypeConfig() { config = new TypeConfig(typeof(T)); var excludedProperties = JsConfig<T>.ExcludePropertyNames ?? new string[0]; var excludedGlobalBaseTypes = JsConfig.GlobalExcludedBaseTypes ?? new Type[0]; var excludedGlobalProperties = JsConfig.GlobalExcludedProperties ?? new string[0]; IEnumerable<PropertyInfo> properties = null; if (excludedProperties.Any() || excludedGlobalBaseTypes.Any() || excludedGlobalProperties.Any()) { properties = config.Type.GetSerializableProperties(). Where(x => !excludedProperties.Contains(x.Name) && !excludedGlobalProperties.Contains(x.Name) && !excludedGlobalBaseTypes.Contains(x.PropertyType.BaseType)); } else { properties = config.Type.GetSerializableProperties(); } Properties = properties.Where(x => x.GetIndexParameters().Length == 0).ToArray(); Fields = config.Type.GetSerializableFields().ToArray(); }
在您的Global.asax只需添加以下两行:
JsConfig.GlobalExcludedProperties = new[] { "EntityKey", "EntityState" }; JsConfig.GlobalExcludedBaseTypes = new[] { typeof(RelatedEnd), typeof(EntityReference) };
这就是它 - EntityState及的EntityKey将不再被序列化,你就不再需要担心循环依赖。
但是,再一次- 这是不是最佳实践 -而只要你稳定你的解决方案一定要遵循什么mythz建议,向DTO的迁移。
您可以使用ScriptIgnore你的模型属性:
public class Item
{
[ScriptIgnore]
public Item ParentItem { get; set; }
}
文章来源: Do not serialize Entity Framework class references in JSON (ServiceStack.Text library)