我正在使用 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/