我终于从EF 4.5升级到EF 6.1,但我遇到了一些我无法克服的不同行为。我正在使用Database-First设计。
我有一个Person表,其中包含CompanyID FK属性和公司导航属性:
public partial class Person
{
... other properties ...
public int CompanyID { get; set; }
public virtual Company Company { get; set; }
}
使用语法
加载人物对象时dbcontext.Persons.FirstOrDefault(p => p.Id == id)
返回的person对象设置了CompanyID,并且公司属性按预期延迟加载(我使用Database.Log输出生成的SQL并且已验证的公司是延迟加载的)。
我的问题是当CompanyID最初为null时。如果我设置了它的值,我就无法根据新的CompanyID值将Company属性设置为延迟加载。这在EF4.5中有效,所以我希望在EF6中有类似的方式来获得相同的行为。
有什么想法吗?在此先感谢。
*已编辑* 我忘了包含"虚拟"上面代码示例中公司属性上的关键字。
答案 0 :(得分:1)
不幸的是你是对的,在EF6中似乎有一些奇怪的延迟加载行为。
对于其他读者,这里有两个场景,显示两个(都是不正确的)行为。假设数据库包含2个Company
= 1和2的Id
条记录,以及Customer
= 1的CompanyId
记录。
(A)
var e = db.Employees.FirstOrDefault(x => x.Id == 1);
e.CompanyId = 2;
var c = e.Company;
结果:变量c
包含null
(B)
var e = db.Employees.FirstOrDefault(x => x.Id == 1);
var c1 = e.Company;
e.CompanyId = 2;
var c2 = e.Company;
结果:变量c2
与c1
相同,并引用Company
Id=1
不幸的是,我可以建议你解决方法而不是一般解决方案。解决方法是在更改FK属性后包括这样的调用:
e.CompanyId = 2;
db.Entry(e).Reference(x => x.Company).IsLoaded = false; // The "fix"
var c = e.Company; // Works