NHiberante 无法初始化代理 - 没有会话

问题描述

这是我在课堂上使用的一段代码 protected override JsonProperty CreateProperty(MemberInfo member,MemberSerialization memberSerialization) {

检查我在对象中的属性是否可序列化

if (property.ShouldSerialize == null) {
            property.ShouldSerialize = instance => {
                try {
                    PropertyInfo prop = (PropertyInfo)member;
                    if (prop.CanRead) {
                        var value = prop.GetValue(instance,null);
                        
                        if (value != null
                            && value.GetType().IsSubclassOfRawGeneric(typeof(NHibernate.Collection.Generic.PersistentGenericBag<>))
                            && !((value as NHibernate.Collection.AbstractPersistentCollection).WasInitialized)) {
                            return false;
                        }
                        return true;
                    }
                }
                catch (Exception e) {
                    var m = e.Message;
                }
                return false;
            };
        }

prop.GetValue(instance,null);因代理错误而失败,我可以在不触及对象的数据结构的情况下在此级别进行干预吗?

我曾尝试将 ReferenceLoopHandling 设置为忽略,但收效甚微。

解决方法

根据您的想法,我能够解决我的代理对象问题,如下所示:

public class NHibernateContractResolver : DefaultContractResolver {

    protected override JsonContract CreateContract(Type objectType) {
        if (typeof(INHibernateProxy).IsAssignableFrom(objectType)) {
            return base.CreateObjectContract(objectType);
            //return base.CreateContract(objectType.BaseType);
        }
        return base.CreateContract(objectType);
    }
    protected override JsonProperty CreateProperty(MemberInfo member,MemberSerialization memberSerialization) {
        JsonProperty property = base.CreateProperty(member,memberSerialization);
        property.ShouldSerialize = instance => {
            {
                try {
                    PropertyInfo prop = (PropertyInfo)member;
                    if (prop.CanRead) {
                        var value = prop.GetValue(instance,null);
                        if (value != null
                        && value.GetType().Name.Equals("PersistentGenericBag`1")) {
                            var item = ((IList)value)[0];
                        }
                        return true;
                    }
                    return false;
                } catch (Exception) {
                    return false;
                }
            };
        };
        return property;
    }