gpt4 book ai didi

c# - EF6 - 使用可空属性(外键、TPH)时无效的 SQL 查询

转载 作者:行者123 更新时间:2023-11-30 22:05:22 25 4
gpt4 key购买 nike

Entity Framework 为以下 LINQ 查询生成无效的 SQL 查询:

Car[] results = this.DbContext.Cars
.Where(x => !x.ParentId.HasValue) // also for x.ParentId == null
.ToArray();

我的 ParentId 属性是可为空的 int,同一个表(Id 属性)的外键。我的结果是一个空数组,但它不应该。我使用其他表使用了类似的查询(检查可空属性没有值)并且它工作得很好。在这种情况下,不同之处在于 ParentId 是外键,数据库表使用 TPH。这是一个错误还是我犯了一些错误?为什么 EF 完全忽略可为空的属性?我的配置和 EF 生成的 SQL(命名只是为了举例,例如“Car”):

上下文配置:

// TPH (Table per Hierarchy)
modelBuilder.Entity<Car>()
.Map<CarA>(x => x.Requires("type").HasValue(1))
.Map<CarB>(x => x.Requires("type").HasValue(2))
.Map<CarC>(x => x.Requires("type").HasValue(3))
.Map<CarD>(x => x.Requires("type").HasValue(4));

// parent child relationship
modelBuilder.Entity<Car>()
.HasMany(x => x.Children)
.WithRequired()
.HasForeignKey(child => child.ParentId);

我的类(class)属性:

[Column("parent_id")]
public int? ParentId { get; set; }

public virtual List<Car> Children { get; set; }

对于:

Car[] results = this.DbContext.Cars
.Where(x => !x.ParentId.HasValue)
.ToArray();

我使用生成的 SQL 得到空结果:

SELECT 
CAST(NULL AS int) AS [C1],
CAST(NULL AS int) AS [C2],
...
...
...
CAST(NULL AS decimal(18,2)) AS [C20],
CAST(NULL AS datetime2) AS [C21]
FROM ( SELECT 1 AS X ) AS [SingleRowTable1]
WHERE 1 = 0

但应该是:

...
...
WHERE [Extent1].[car] IS NULL

对于:

var results = this.DbContext.Cars
.Where(x => x.ParentId.HasValue)
.ToArray();

我使用生成的 SQL 获取所有实体(忽略 ParentId):

SELECT 
[Extent1].[type] AS [type],
[Extent1].[id] AS [id],
[Extent1].[parent_id] AS [parent_id],
[Extent1].[name] AS [name],
...
...
...
FROM [dbo].[car] AS [Extent1]
WHERE [Extent1].[type] IN (1,2,3,4)

在 EF6 6.0.2/6.1.1 和 MS SQL Server 上测试。

最佳答案

哇……这是一个有趣的行为,但解决方案非常简单。您有一个可为空的外键属性,但您根据需要定义了关系。只是改变

modelBuilder.Entity<Car>()
.HasMany(x => x.Children)
.WithRequired()
.HasForeignKey(child => child.ParentId);

modelBuilder.Entity<Car>()
.HasMany(x => x.Children)
.WithOptional()
.HasForeignKey(child => child.ParentId);

它会起作用。

关于c# - EF6 - 使用可空属性(外键、TPH)时无效的 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24416287/

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