c# - EF Include 始终为第一个导航属性生成 INNER JOIN

标签 c# asp.net .net linq entity-framework

我正在使用 Code First 方法并具有以下模型:

public class Person
{
    public int ID {get; set;}
    public string Name {get; set;}

    public int CurrentStationID {get; set;}
    public virtual Station CurrentStation {get; set;}

    public int CurrentTransportationID {get; set;}
    public virtual Transportation CurrentTransporation {get; set;}
}

以及我的 Controller 中的以下代码:

Models.Person model = myDBContext.Persons
                        .Include("CurrentStation")
                        .Include("CurrentTransportation")
                        .Where(p => p.ID == 1)
                        .FirstOrDefault();

即使数据库表“persons”中存在包含 (1, "Testname", 0, 0) 的行,“model”也将为 NULL。

上面生成了一个带有 [...] INNER JOIN stations AS [...] LEFT JOIN transportations [...] 的 SQL 语句。它总是为第一个导航属性执行 INNER JOIN,对于我的所有模型,无论底层表/类型是什么或我指定它们的顺序如何,它始终是第一个 Include()。

想要一个 INNER JOIN,而是对所有的 LEFT JOIN,因为数据库中不需要“CurrentStation”。

为什么 EF 会这样做???我不明白,但我想明白。我没有在任何属性上指定 [Required] 属性,但它的行为就像我指定的一样。

不幸的是,没有 [Optional] 属性,通过 OnModelCreate-override 执行“HasOptional()”对我来说不是一个选项。

最佳答案

如果我没记错的话,为了允许一个属性是可选的或者在数据库意义上可以为空,您必须使该属性可以为空。因此,对于您的 CurrentStationId 属性,您可以尝试按如下方式声明它:

 public int? CurrentStationId {get;set;}

更新post可能对您的情况有所帮助。

关于c# - EF Include 始终为第一个导航属性生成 INNER JOIN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11055162/

相关文章:

asp.net - 在asp.net中使用db4o数据库和gridview控件

c# - 在没有布局的情况下在 MVC 3 中显示页面

c# - 覆盖方法中的默认参数值

c# - 通过 StreamWriter 或文件写入修改数据?

c# - 使用 WinForms 抽象表单

asp.net - 是否可以根据用户角色隐藏/显示Kendo网格列?

c# - 逆序和非逆序列表

c# - 如何检查.NET中用CPLEX编码的模型是否是真实模型?

c# - 哪些 Office 文件查看器和编辑器可用于 Windows Phone 8?

asp.net - 匹配 10-14 位数字的正则表达式