Fluent nHibernate在返回对象中消除代理成员的可能方法
本文关键字:成员 代理 方法 nHibernate 返回 对象 Fluent | 更新日期: 2023-09-27 18:24:38
我有一个类和这个类的映射
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
我怎样才能摆脱它?
Not.LazyLoad()
应该这样做:
References(x => x.SubCategory).Not.LazyLoad().Column("Subcategory");
但是LazyLoad是一件好事,检查一下你是否真的有问题获得proxy
什么是LazyLoad?
集合(数组除外)可能会延迟初始化,这意味着只有当应用程序需要访问它。初始化对用户透明因此应用程序通常不需要担心这一点。
阅读更多文档
在项目站点上,您会发现一个扩展类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 { }
}
}
}