【问题标题】:How to avoid Lazy Loading when accessing foreign key ID property through navigation property?通过导航属性访问外键ID属性时如何避免延迟加载?
【发布时间】:2013-11-25 16:51:17
【问题描述】:

我正在将项目从 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 外键是用户行的一部分,我应该能够访问它而不会导致整个实体的延迟加载(实际上,NHibernate 正确地做到了这一点)。

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

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

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

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

【问题讨论】:

  • 您好 ECC-Dan,您最终是如何解决这个问题的?我面临同样的问题,我不想为每个导航属性添加 ID。
  • 抱歉回复晚了;我从来没有解决这个问题,因为与 NHibernate 相比,由于这个和其他更严重的限制,我们实际上最终放弃了向实体框架的转换。

标签: c# entity-framework ef-code-first entity-framework-6


【解决方案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; }
    // [...]
}

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

更新:

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

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

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

【讨论】:

  • @ECC-Dan:也可能有非强类型的方式。但我目前没有怨恨的知识。
  • 向类添加属性是一回事,修改所有业务代码是另一回事。你说的非强类型方式是什么意思?无论如何,我认为这不会让我不必修改所有代码......
  • non-strong-typed-way,我依稀记得,我曾经参与在 EF 之上开发一个框架,其中实体的属性通过名称通过DbSet 设置(如string) .不知道怎么弄的,很久以前的了,不推荐,就我记忆中的样子;这是一项肮脏的工作。
  • 这可能会起作用,但我宁愿添加外键属性并使用那些......感觉更干净一些。不过谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多