c# - 实体框架生成错误查询
问题描述
我在 .Net 4.7.2 中使用 EntityFramework 6.3.0 我在 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 server 默认长度为 1 个字符。因此,当有它应该找到的记录时,查询不会返回任何记录。模型中的 Status 列定义为
[StringLength(50)]
public string Status { get; set; }
[ForeignKey("Status")]
public virtual xStatus StatusValue { get; set; }
我也尝试过 MaxLength(50) 而不是 StringLength。但生成的查询保持不变。
有人知道怎么修这个东西吗?
更新:这可能与实体框架中的字符串匹配问题相同。适用于字符串文字但不适用于字符串变量
但是使用该票证中指定的 string.Compare 也不起作用。
在我这边进一步调试后,我发现这是我的用户错误,而不是实体框架中的问题。
解决方案
StringLength
似乎被忽略了。这一点引起了我的兴趣:
[ForeignKey("Status")]
public virtual xStatus StatusValue { get; set; }
[ForeignKey]
您可以暂时将其全部或属性注释掉吗?我知道这会破坏任何引用期望实体的 StatusValue 属性的东西,但我可能怀疑这个 xStatus 实体的 PK 会以某种方式影响/覆盖 Statuses 上的 Status 列。这种关系似乎真的怀疑会有一些“类型”关联映射到这个字符串值,而不是通过 Statuses 的 PK。
如果这样可以修复查询,请检查此 xStatus 实体上的 Status 列或 PK 以查看它是否也具有[StringLength]
属性。