通过导航属性访问外键ID属性时如何避免延迟加载?

ECC*_*Dan 5 c# entity-framework ef-code-first entity-framework-6

我正在将项目从 NHibernate 转换为实体框架 6。

鉴于这个简单的模型:

public class User
{
    public int ID { get; set; }
    public string FullName { get; set; }
    public virtual Organization Organization { get; set; }
    // [...]
}

public class Organization
{
    public int ID { get; set; }
    public string Name { get; set; }
    public virtual List<User> Users { get; set; }
    // [...]
}
Run Code Online (Sandbox Code Playgroud)

通过组织导航属性访问主键 (ID) 将导致整个组织实体加载到上下文中:

foreach(var user in db.Users)
    Console.WriteLine(user.Organization.ID);
Run Code Online (Sandbox Code Playgroud)

鉴于 OrganizationID 外键是 User 行的一部分,我应该能够访问它而不会导致整个实体的延迟加载(事实上,NHibernate 正确地做到了这一点)。

没有将外键 ID 的属性添加到我所有的 100 多个实体中,以便我可以在不加载实体的情况下访问它们的值,有什么可以避免这种行为的吗?

编辑:此外,即使进行空检查也会导致组织实体的负载(不在 NHibernate 中):

foreach(var user in db.Users)
    Console.WriteLine(user.Organization != null);
Run Code Online (Sandbox Code Playgroud)

我想这是由于实体代理在这两个框架中实现方式的根本差异。所以我必须使我的所有代码适应这种新的令人沮丧的行为......除非有人已经经历过这个并且可以启发我?

Ste*_*fan 1

不,您需要将它们添加为您的类中的属性(也就是说,如果您希望它是强类型的),就像这样直接访问它。

public class User
{
    public int ID { get; set; }
    public string FullName { get; set; }

    //added ID    
    public int OrganizationID { get; set; }
    public virtual Organization Organization { get; set; }
    // [...]
}
Run Code Online (Sandbox Code Playgroud)

通过访问int您将防止延迟加载,EF 将通过命名约定绑定 ID。话虽如此:100 多个课程... :|

更新:

正如我刚刚意识到的那样;你可能想尝试:

db.Users
        .Include("Organization.ID")
        .Where(/*your stuff*/) //etc.;
Run Code Online (Sandbox Code Playgroud)

我不确定它是否会完全加载嵌套属性。如果没有,可能会带来很小的性能提升。