Nhibernate:获取真正的实体类而不是代理类

时间:2011-03-28 04:16:23

标签: nhibernate

有没有办法让nhibernate返回我的类而不是它的代理类?我不介意它是不是懒惰或无法更新。

6 个答案:

答案 0 :(得分:11)

您可以使用此代码取消注册类

session.PersistenceContext.Unproxy(proxiedInstance)

答案 1 :(得分:2)

您应该通过定义lazy =“false”

在映射中定义它
<class name="MyEntity" table="MyTable" lazy="false">
</class>

答案 2 :(得分:0)

我正在使用AutoMapper在实体框架中实现类似的功能。

var nonProxiedInstance = Mapper.DynamicMap<YourType>(proxiedInstance);

如果您没有导航属性,那将会有效。否则,您需要配置映射以忽略这些属性。

注意:这显然是一种效率低下的解决方案。

答案 3 :(得分:0)

您可以使用http://sessionfactory.blogspot.com/2010/08/hacking-lazy-loaded-inheritance.html中描述的技术(您需要递归执行此操作)

答案 4 :(得分:0)

您可以使用以下代码获取真实对象

InstanceType instance;
if (proxiedInstance is INHibernateProxy)
{
 var lazyInitialiser = ((INHibernateProxy)proxiedInstance).HibernateLazyInitializer;
 instance = (InstanceType)lazyInitialiser.GetImplementation();
}

答案 5 :(得分:0)

session.PersistenceContext.Unproxy(proxiedInstance) 不会解除关联的代理。 no-proxy 延迟加载也做同样的事情。 禁用延迟加载不是一个好主意,AutoMapper 会导航所有属性并触发加载机制。

来自 IUnitOfWork.Unproxy

NHUnit package 可用于取消代理对象及其关系。此方法不会错误地初始化任何代理对象。