繁体   English   中英

实体框架生成错误查询

[英]Entity Framework generating a bad query

我正在使用 EntityFramework 6.3.0 in.Net 4.7.2 我在 C# 中有这个代码

int userId = 1;
string statusValue = StatusCodes.Failing; // This is a string for anyone wondering, not an Enum
return (from statusRow in DbContext.Statuses
    where statusRow.UserId == userId
          && statusRow.Status == statusValue
          && statusRow.Times > 0
    orderby statusRow.CreatedAtDateTimeOffset descending
    select statusRow).FirstOrDefault();

EntityFramework 正在生成此查询

DECLARE @p__linq__0 int = 1;
DECLARE @p__linq__1 nvarchar = 'Failing';

SELECT TOP (1) 
    [Project1].[Id] AS [Id], 
    [Project1].[UserId] AS [UserId], 
    [Project1].[Times] AS [Times], 
    [Project1].[CreatedAtDateTimeOffset] AS [CreatedAtDateTimeOffset], 
    [Project1].[Status] AS [Status], 
    FROM ( SELECT 
        [Extent1].[Id] AS [Id], 
        [Extent1].[UserId] AS [UserId], 
        [Extent1].[Times] AS [Times], sOverridden], 
        [Extent1].[CreatedAtDateTimeOffset] AS [CreatedAtDateTimeOffset], 
        [Extent1].[Status] AS [Status], 
        FROM [dbo].[Statuses] AS [Extent1]
        WHERE ([Extent1].[UserId] = @p__linq__0) AND (([Extent1].[Status] = @p__linq__1) OR (([Extent1].[Status] IS NULL) AND (@p__linq__1 IS NULL))) AND ([Extent1].[Times] > 0)
    )  AS [Project1]
    ORDER BY [Project1].[CreatedAtDateTimeOffset] DESC

问题是它声明 p__linq_1 的第二行。 它将类型设置为 nvarchar,然后 sql 服务器默认长度为 1 个字符。 因此,当有它应该找到的记录时,查询不会返回任何记录。 model 中的 Status 列定义为

[StringLength(50)]
public string Status { get; set; }

[ForeignKey("Status")]
public virtual xStatus StatusValue { get; set; }

我也尝试过 MaxLength(50) 而不是 StringLength。 但生成的查询保持不变。

有人知道怎么修这个东西吗?

更新:这可能与实体框架中的字符串匹配问题相同。 适用于字符串文字但不适用于字符串变量

但是使用该票证中指定的 string.Compare 也不起作用。


在我这边进一步调试后,我发现这是我的用户错误,而不是实体框架中的问题。

您可以使用以下更改强制类型为varchar而不是 nvarchar:

[Column(TypeName = "VARCHAR")]
[StringLength(50)]
public string Status { get; set; }

通过上述更改,EF 查询将生成参数为varchar

StringLength似乎被忽略了。 这一点引起了我的兴趣:

[ForeignKey("Status")]
public virtual xStatus StatusValue { get; set; }

您可以暂时将其全部或[ForeignKey]属性注释掉吗? 我知道这会破坏任何引用期望实体的 StatusValue 属性的东西,但我可能怀疑这个 xStatus 实体的 PK 会以某种方式影响/覆盖 Statuses 上的 Status 列。 这种关系似乎真的怀疑会有一些“类型”关联映射到这个字符串值,而不是通过 Statuses 的 PK。

如果这样可以修复查询,请检查此 xStatus 实体上的 Status 列或 PK 以查看它是否也具有[StringLength]属性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM