不要在JSON序列化实体框架类引用(ServiceStack.Text库)(Do not seria

2019-07-20 06:59发布

由于大部分是我去过的人的序列化(可怕的)EF对象JSON的时候也遇到了循环引用错误的问题。 这样做db.Detach(efObject)帮助 - 但我仍然得到像垃圾“的EntityKey”输出。

所以我在想,如果有一个选项(通过JsConfig?)告诉串行忽略属性既可以通过名称(的EntityKey),或者通过类型(的EntityReference <T>或EntityCollection <T>)?

或将我不得不产品总数沟EF并切换到更好的东西(我不想手动定义ORM类 - 我希望他们从数据库自动生成)?

Answer 1:

你不应该试图重新使用实体框架类型的DTO的 ,因为它们是由DTO的设计不良的替代品。 你应该使用他们ServiceStack的内置TranslateTo / PopulateFrom映射器(或AutoMapper),而不是映射到特殊目的DTO类型和返回的。

随着中说,使用IgnoreDataMember或指定数据成员 ,你想序列化的属性。



Answer 2:

免责声明:我目前在做原型和我方便更重要比的解决方案的鲁棒性。 所以,我所做的是不是一个很好的路要走-我在这里复制粘贴以防万一别人是在相同的位置,并希望有一个简单的(不是最好的)的出路。 你已经被警告。

  1. 我相信你已经在你的MVC项目中使用ServiceStack.Text。 如果不是这种情况,请从这个QA说明: ASP.NET MVC Json的日期时间序列化转换为UTC

  2. 看看从GitHub ServiceStack.Text库 (当然)引用它在你的MVC项目,而不是DLL和。

  3. 这种加入ServiceStack.Text / JsConfig类:

     // Added properties for global excluding public static Type[] GlobalExcludedBaseTypes; public static string[] GlobalExcludedProperties; 
  4. 更改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(); } 
  5. 在您的Global.asax只需添加以下两行:

     JsConfig.GlobalExcludedProperties = new[] { "EntityKey", "EntityState" }; JsConfig.GlobalExcludedBaseTypes = new[] { typeof(RelatedEnd), typeof(EntityReference) }; 

这就是它 - EntityState及的EntityKey将不再被序列化,你就不再需要担心循环依赖。

但是,再一次- 这是不是最佳实践 -而只要你稳定你的解决方案一定要遵循什么mythz建议,向DTO的迁移。



Answer 3:

您可以使用ScriptIgnore你的模型属性:

public class Item
{
    [ScriptIgnore]
    public Item ParentItem { get; set; }
}


文章来源: Do not serialize Entity Framework class references in JSON (ServiceStack.Text library)