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



我正在将一个项目从NHibernate转换为Entity Framework 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; }
    // [...]
}

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

foreach(var user in db.Users)
    Console.WriteLine(user.Organization.ID);

假设OrganizationID外键是User行的一部分,我应该能够访问它,而不会导致整个实体的懒惰加载(事实上,NHibernate做得很好)。

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

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

foreach(var user in db.Users)
    Console.WriteLine(user.Organization != null);

我想这是由于在这两个框架中实现实体代理的方式存在根本差异。所以我必须调整我所有的代码来适应这种新的令人沮丧的行为。。。除非有人已经经历了这一切,并能启发我?

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

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; }
    // [...]
}

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

更新:

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

db.Users
        .Include("Organization.ID")
        .Where(/*your stuff*/) //etc.;

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

最新更新