【问题标题】:NHibernate returning results from Web APINHibernate 从 Web API 返回结果
【发布时间】:2016-11-13 02:32:35
【问题描述】:

我正在使用 Nhibernate 来获取具有延迟加载属性的集合,但是在 Nhibernate 会话关闭后序列化程序尝试序列化延迟属性时无法返回它。那么有没有办法告诉 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]

【问题讨论】:

  • 为什么不忽略该属性的序列化?
  • 我已经尝试了来自 this 链接的 GetSerializableMembers 方法。如果我在代理匹配上返回 null,它会引发 null 引用异常,如果我返回基本类型,它会说没有找到 Type#0 的行。
  • NHibernateUtil (github.com/nhibernate/nhibernate-core/blob/master/src/…) 有一些有用的方法可能会有所帮助。

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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2014-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多