Entity Framework генерирует неверный запрос - PullRequest
0 голосов
/ 31 октября 2019

Я использую EntityFramework 6.3.0 в .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 символ. Из-за этого запрос не возвращает записей, когда есть записи, которые он должен найти. Столбец Состояние в модели определяется как

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

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

Я также пробовал MaxLength (50) вместо StringLength. Но сгенерированный запрос остается тем же.

Кто-нибудь знает, как это исправить?

Обновление: это может быть той же проблемой, что и Проблема соответствия строк в платформе Entity. Работает для строкового литерала, но не для строковой переменной

Но использование строки. Сравнение, указанное в этом билете, также не работает.


После дальнейшей отладки на моей сторонеЯ обнаружил, что это была ошибка пользователя, а не проблема в Entity Framework.

Ответы [ 2 ]

0 голосов
/ 01 ноября 2019

StringLength похоже игнорируется. Этот бит вызывает у меня интерес:

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

Можете ли вы временно закомментировать это, либо полностью, либо с атрибутом [ForeignKey]? Я знаю, что это нарушит все, что ссылается на свойство StatusValue, ожидающее сущность, но я могу подозревать, что PK этой сущности xStatus каким-то образом влияет на / переопределяет столбец Status в Состояниях. Кажется, что это отношение действительно подозрительно, что существует некоторая «типовая» ассоциация, сопоставленная с этим строковым значением, а не через PK Статусов.

Если это исправляет запрос, проверьте столбец Status или PK в этой сущности xStatus, чтобы увидетьесли он также имеет атрибут [StringLength].

0 голосов
/ 31 октября 2019

Вы можете указать тип varchar вместо nvarchar, используя приведенное ниже изменение:

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

При вышеуказанном изменении запрос EF сгенерирует параметр как varchar.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...