我正在将项目从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.;
我不确定它是否会完全加载嵌套属性.如果没有,则可能是性能上的小幅提升.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。