NHibernate返回Web API

时间:2016-11-13 02:32:35

标签: asp.net-web-api nhibernate asp.net-web-api2

我正在使用Nhibernate来获取一个具有延迟加载属性但却无法返回它的集合,因为在Nhibernate会话关闭后,Serializer会尝试序列化lazy属性。那么有没有办法告诉NHibernate给我一个真正的列表,如果有卸载的懒惰集合,它会把它们留空?

例如

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

Store与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();

我得到的错误是

外部异常:从“PartProxy”上的“datedcost”获取值时出错。

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

1 个答案:

答案 0 :(得分:1)

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