2016-11-13 63 views
0

我使用Nhibernate来获取具有延迟加载属性的集合,但在返回它时出现问题,因为序列化程序试图在Nhibernate会话关闭后序列化lazy属性。那么有没有办法告诉NHibernate给我一个真正的列表,如果有卸载的懒惰集合,它会让它们为空?NHibernate从Web API返回结果

例如

IEnumerable<Store> stores = StoreService.GetList(1, 2); 

商店具有一个一对多映射与被设置为延迟加载然后导致序列化错误StockItems。我试过

List<Store> stores_r = stores.ToList(); 

但我得到了同样的结果。是否有东西会遍历列表并获取一对一的关系,并忽略一对多延迟加载并返回完成的列表?

感谢

编辑:解决方法我试过,但仍然没有工作

public class NHibernateContractResolver: DefaultContractResolver 
    { 
    protected override JsonContract CreateContract(Type objectType) 
    { 
     if (typeof(NHibernate.Proxy.INHibernateProxy).IsAssignableFrom(objectType) || typeof(NHibernate.Proxy.ILazyInitializer).IsAssignableFrom(objectType)) 
     { 
      var oType = objectType.GetInterfaces().FirstOrDefault(i => i.FullName.StartsWith("Navace.Models")); 
      return oType != null ? base.CreateContract(oType) : base.CreateContract(objectType.BaseType); 
     } 

     return base.CreateContract(objectType); 
    } 

    protected override List<MemberInfo> GetSerializableMembers(Type objectType) 
    { 
     if (typeof(NHibernate.Proxy.INHibernateProxy).IsAssignableFrom(objectType)) 
     { 
      return base.GetSerializableMembers(objectType.BaseType); 
     } 
     else 
     { 
      return base.GetSerializableMembers(objectType); 
     } 
    } 
} 

尝试手动序列化,所以我可以使用所发生的事情

IEnumerable<Store> stores = StoreService.GetList(1, 2); 

Store> storess = stores.ToList(); 

JsonSerializer sr = new JsonSerializer 
      { 
       ReferenceLoopHandling = ReferenceLoopHandling.Ignore, 
       ContractResolver = new NHibernateContractResolver(), 
       NullValueHandling = NullValueHandling.Ignore, 
      }; 

StringWriter stringWriter = new StringWriter(); 
JsonWriter jsonWriter = new Newtonsoft.Json.JsonTextWriter(stringWriter); 
sr.Serialize(jsonWriter, storess); 

string res = stringWriter.ToString(); 

我得到的错误是

外例:E在'PartProxy'上从'datedcost'获得价值。

内部异常:与给定的标识符的行存在[Navace.Models.Part#0]

+0

为什么不忽略该属性的序列化? –

+0

我试过GetSerializableMembers方法[this](http://stackoverflow.com/questions/286721/json-net-and-nhibernate-lazy-loading-of-collections/5926718#5926718)链接。如果我在代理匹配上返回null,它将抛出空引用异常,并且如果我返回基类型,则表示没有找到类型为#0的行。 – user2119597

+0

看看这有助于: - http://stackoverflow.com/questions/6507889/how-to-ignore-a-property-in-class-if-null-using-json-net –

回答

1

我的建议是回到视图模型,而不是域模型。它可能有数据时返回一个空的集合属性是令人困惑的。通过将领域模型转换为视图模型(使用LINQ Select或AutoMapper),序列化器将只触摸(并尝试延迟加载)视图模型中的属性。