簡體   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