我有两个实体:客户和帐户。一个客户有多个账户。
我的客户映射是:
<bag cascade="all" name="Accounts" table ="Accounts" mutable="true" inverse="true">
<key>
<column name="Customer_Id" />
</key>
<one-to-many class="Account, POCOEntities, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
</bag>
我的帐户映射是:
<many-to-one cascade="all" class="Customer, POCOEntities, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" name="Customer">
<column name="Customer_Id" />
</many-to-one>
在我的应用程序中,我根据客户 ID 检索客户:
var customer = _customerRepository.GetById(custID);
然后我尝试通过以下方式获取客户的第一个帐户:
Account account = customer.Accounts.FirstOrDefault();
然后我收到以下异常:“NHibernate.LazyInitializationException:非法访问加载集合”
我已经尝试过针对此处发布的此问题的其他解决方案,但没有任何效果。真正奇怪的是,如果我在尝试访问该帐户之前插入以下代码,那么一切都会正常:
var acc = from a in _accountRepository.GetAll()
where a.Customer.Equals(customer)
select a;
我在前面的代码中所做的只是创建一个我什至不使用的变量。不知何故,它会导致语句“Account account = customer.Accounts.FirstOrDefault();”虽然要成功。
有人知道这里发生了什么吗?
最佳答案
我认为这非常简单:您不再有与该实体关联的打开的 ISession。而且,我认为这是由于将 session 管理(打开/关闭 session )作为存储库的责任,这是错误的。
关于NHibernate - 非法访问加载集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5512807/