C# 当通过导航属性访问外键ID属性时,如何避免延迟加载?
我正在将一个项目从NHibernate转换为实体框架6 鉴于这一简单模型:C# 当通过导航属性访问外键ID属性时,如何避免延迟加载?,c#,entity-framework,ef-code-first,entity-framework-6,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 I
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; }
// [...]
}
鉴于OrganizationID外键是用户行的一部分,我应该能够访问它,而不会导致整个实体的延迟加载(事实上,NHibernate可以正确地做到这一点)
除了将外键ID的属性添加到我所有的100多个实体中,这样我就可以在不加载实体的情况下访问它们的值之外,还有什么方法可以避免这种行为吗?
编辑:此外,即使执行空检查也会导致组织实体的加载(不在NHibernate中):
我想这是因为在这两个框架中实体代理的实现方式存在根本性差异。所以我必须调整我所有的代码以适应这种新的令人沮丧的行为。。。除非有人已经经历了这一过程并能给我一些启示?没有,否则您需要将它们作为属性添加到类中(也就是说,如果您希望它是强类型的),这样才能直接访问它
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:也可能有一种非强类型的方式。但我目前还没有相关的知识,将属性添加到类是一回事,修改所有业务代码则完全是另一回事。您所说的非强类型方式是什么意思?在任何情况下,我都不认为这会使我免于修改所有代码…
非强类型方式
,我模糊地记得,我曾经参与在EF之上开发一个框架,其中实体的属性通过DbSet
按名称设置(如string
)。我不知道是怎么回事,那是很久以前的事了,就我记忆所及,我不会推荐它;这是一个肮脏的工作。这可能会起作用,但我宁愿添加外键属性并使用它们。。。感觉有点干净。谢谢你!你好,ECC Dan,你最终是如何解决这个问题的?我面临着同样的问题,我不想为每个导航属性添加ID。很抱歉回复太晚;我从来没有抽出时间来解决这个问题,因为与NHibernate相比,由于这个和其他更严重的限制,我们实际上最终放弃了向实体框架的转换。
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; }
// [...]
}
db.Users
.Include("Organization.ID")
.Where(/*your stuff*/) //etc.;