默认情况下,实体框架使用延迟加载来导航属性。这就是为什么应将这些属性标记为虚拟的原因-
EF为您的实体创建代理类,并覆盖导航属性以允许延迟加载。例如,如果您有此实体:
public class MemberLoan{ public string LoandProviderCode { get; set; } public virtual Membership Membership { get; set; }}实体框架将返回从该实体继承的代理,并向该代理提供DbContext实例,以允许稍后延迟加载成员资格:
public class MemberLoanProxy : MemberLoan{ private CosisEntities db; private int membershipId; private Membership membership; public override Membership Membership { get { if (membership == null) membership = db.Memberships.Find(membershipId); return membership; } set { membership = value; } }}因此,实体具有用于加载实体的DbContext实例。那是你的问题。您对
usingCosisEntities的用法有所了解。它在返回实体之前布置上下文。稍后某些代码尝试使用延迟加载的导航属性时,它会失败,因为此时已处理上下文。
要解决此问题,您可以使用后面将急需的导航属性加载:
IQueryable<MemberLoan> query = db.MemberLoans.Include(m => m.Membership);
这将预加载所有成员身份,并且不会使用延迟加载。有关详细信息,请参阅MSDN上的“
加载相关实体 ”。



