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]
为什么不忽略该属性的序列化? –
我试过GetSerializableMembers方法[this](http://stackoverflow.com/questions/286721/json-net-and-nhibernate-lazy-loading-of-collections/5926718#5926718)链接。如果我在代理匹配上返回null,它将抛出空引用异常,并且如果我返回基类型,则表示没有找到类型为#0的行。 – user2119597
看看这有助于: - http://stackoverflow.com/questions/6507889/how-to-ignore-a-property-in-class-if-null-using-json-net –