我正在使用代码优先方法并具有以下模型:
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;}
}
我的控制器中的以下代码:
Models.Person model = myDBContext.Persons
.Include("CurrentStation")
.Include("CurrentTransportation")
.Where(p => p.ID == 1)
.FirstOrDefault();
即使一行带有(1, "测试名称", 0, 0)存在于数据库表“persons”中。
上面生成了一个 SQL 语句[...] INNER JOIN stations AS [...] LEFT JOIN transportations [...]
。对于我的所有模型,它总是为第一个导航属性执行 INNER JOIN,无论基础表/类型是什么或我指定它们的顺序,它始终是第一个 Include()。
I do not想要对所有这些进行 INNER JOIN 但使用 LEFT JOIN,因为“CurrentStation”不需要位于数据库中。
EF为什么要这么做???我不明白,但我想明白。我没有在任何属性上指定 [Required] 属性,但它的行为就像我指定了一样。
不幸的是,没有 [Optional] 属性,并且通过 OnModelCreate 覆盖执行“HasOptional()”对我来说不是一个选择。
如果我没记错的话,为了允许属性是可选的或者在数据库意义上可以为空,您必须使该属性可以为空。因此,对于 CurrentStationId 属性,您可以尝试按如下方式声明它:
public int? CurrentStationId {get;set;}
UPDATE
This post https://stackoverflow.com/questions/4290802/entity-framework-include-with-left-join-is-this-possible可能对你的情况有一些帮助。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)