EF6:在设置FK属性后强制加载导航属性

时间:2016-04-18 13:36:32

标签: c# entity-framework entity-framework-6

我终于从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中有类似的方式来获得相同的行为。

有什么想法吗?在此先感谢。

*已编辑* 我忘了包含"虚拟"上面代码示例中公司属性上的关键字。

1 个答案:

答案 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;

结果:变量c2c1相同,并引用Company Id=1

不幸的是,我可以建议你解决方法而不是一般解决方案。解决方法是在更改FK属性后包括这样的调用:

e.CompanyId = 2;
db.Entry(e).Reference(x => x.Company).IsLoaded = false; // The "fix"
var c = e.Company; // Works