Fluent-nHibernate возможный способ избавления от прокси-членов при возвращении объекта - PullRequest
1 голос
/ 14 февраля 2012

У меня есть класс и карта для этого класса

public class TestClass
{
    public virtual Subcategory SubCategory { get; set; }
}

public TestClassMuMap()
{
    Id(e => e.Id).Column("ID").GeneratedBy.Assigned();
    References(x => x.SubCategory).Column("Subcategory");
}

В полученных объектах я нашел нового члена SubcategoryProxyf528587c5459469ba2347093600432d8 Как от него избавиться?

Ответы [ 2 ]

3 голосов
/ 14 февраля 2012

Not.LazyLoad() должно сделать это:

References(x => x.SubCategory).Not.LazyLoad().Column("Subcategory");

Но LazyLoad - это хорошо, проверьте, действительно ли у вас проблемы с получением proxy

Что такое LazyLoad?

Коллекции (кроме массивов) могут быть лениво инициализированы, то есть они загружают свое состояние из базы данных только тогда, когда приложению необходим доступ к ней.Инициализация происходит прозрачно для пользователя, поэтому приложению обычно не нужно беспокоиться об этом.

Подробнее см. В документах

0 голосов
/ 30 декабря 2016

На сайте проекта вы найдете класс расширения NHibernateUnProxyExtension, который сделает всю работу за вас:

public static class NHibernateUnProxyExtension
{
    /// <summary>
    /// Recursively removes NHibernate proxies from an object. Do not use session.Save(objt) or session.Update(objt) after unproxying, you might lose important data
    /// </summary>
    public static void UnProxy(this object objt)
    {
        for (int i = 0; i < objt.GetType().GetProperties().Count(); i++)
        {
            try
            {
                PropertyInfo propertyInfo = objt.GetType().GetProperties()[i];
                var propValue = propertyInfo.GetValue(objt, null);
                if (propValue.IsProxy())
                {
                    System.Type objType = NHibernateProxyHelper.GetClassWithoutInitializingProxy(propValue);
                    //Creates a new NonProxyObject
                    object NonProxyObject = Activator.CreateInstance(objType);
                    //Copy everything that it can be copied
                    foreach (var prop in propValue.GetType().GetProperties())
                    {
                        try
                        {
                            object a = prop.GetValue(propValue);
                            NonProxyObject.GetType().GetProperty(prop.Name).SetValue(NonProxyObject, a);
                        }
                        catch { }
                    }
                    //Change the proxy to the real class
                    propertyInfo.SetValue(objt, NonProxyObject);
                }

                //Lists
                if (propValue.GetType().IsGenericType && propValue.GetType().GetGenericTypeDefinition() == typeof(PersistentGenericBag<>))
                {
                    try
                    {
                        int count = (int)(propValue.GetType().GetProperty("Count").GetValue(propValue));
                    }
                    catch { propertyInfo.SetValue(objt, null); }
                }

                if (propValue.GetType().Assembly.GetName().Name != "mscorlib" &&
                    propValue.GetType().Assembly.GetName().Name != "NHibernate")
                {
                    // user-defined!
                    propValue.UnProxy();
                }
            }
            catch { }
        }
    }
}
...