有没有办法让nhibernate返回我的类而不是它的代理类?我不介意它是不是懒惰或无法更新。
答案 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 可用于取消代理对象及其关系。此方法不会错误地初始化任何代理对象。