Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当通过导航属性访问外键ID属性时,如何避免延迟加载?_C#_Entity Framework_Ef Code First_Entity Framework 6 - Fatal编程技术网

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

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

我正在将一个项目从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 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.;