ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-07-09 00:06:10  阅读:114  来源: 互联网

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


我正在将项目从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行的一部分,我应该能够访问它而不会导致整个实体的Lazy Load(实际上,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.;

我不确定它是否会完全加载嵌套属性.如果没有,则可能是性能上的小幅提升.

标签:c,entity-framework,ef-code-first,entity-framework-6
来源: https://codeday.me/bug/20190708/1407199.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有