gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 00:26:27 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com