Entity Framework Core 2.1 System.Data.SqlClient.SqlException (0x80131904): Флаг типа не является определенным типом системы - PullRequest
0 голосов
/ 17 июня 2019

После обновления до EntityFramework 2.1.11 я столкнулся со следующей проблемой.

System.Data.SqlClient.SqlException (0x80131904): Type Flag is not a defined system type.

Я получаю эту ошибку для внутреннего перевода Linq to SQL. В таблице базы данных есть два столбца с типом tinyint, которые имеют соответствующий тип C # в виде байта, который вызывает исключение в Linq при выполнении запроса.

Причина в том, что column == 1 переводится как CAST(1 AS Flag) внутренне в 2.1, которая работала в 2.0.

Это работает, если мы change == 1 до == Convert.ToByte(1) или назначаем байтовую переменную и используем ее как == переменную, которая, я думаю, не идеальное исправление.

Это фрагмент кода, который выдает ошибку.

    var query = await (from pl in _azureContext.Product.AsNoTracking()
    where pl.Primary ==1 &&  pl.Deleted == 0
    select new Product
    {
      ProductId = pl.ProductId,
      ProductName = pl.ProductName
    }).OrderBy(P => P.ProductName).ToListAsync<Product>();

Внутренний перевод SQL, который выдает исключение, выглядит следующим образом:

SELECT  [pl].[ProductId] , [pl].[ProductName] FROM [Products] AS [pl] WHERE ([pl].[Primary] = CAST(1 AS Flag)) AND ([pl].[Deleted] = CAST(0 AS Flag)) ORDER BY [pl].[ProductName] 

Ожидаемый перевод SQL выглядит следующим образом:

SELECT  [pl].[ProductId] , [pl].[ProductName] FROM [Products] AS [pl] WHERE ([pl].[Primary] = 1) AND ([pl].[Deleted] = 0) ORDER BY [pl].[ProductName] 

Похоже, ошибка в Entityframework Core 2.1. Может ли кто-нибудь помочь мне в этом?

Добавлена ​​дополнительная информация на основе комментариев Дэвида. 1) Я не создал ни одного пользовательского типа для этого и не пропал. 2) Тип данных C # - Byte для pl. Primary и pl.Deleted. 3) В dbContext я вижу следующее в методе onModelCreating. entity.Property (e => e.Primary) .HasColumnType ("Flag"); entity.Property (e => e.Deleted) .HasColumnType ("Flag");

Примечание: DbContext был сгенерирован ранее с помощью .net core 2.0, и никаких изменений в коде для этого не было.

1 Ответ

0 голосов
/ 17 июня 2019

Проблема в том, что у вас есть HasColumnType("Flag") в конфигурации для ваших свойств.Это говорит Entity Framework, что тип столбца Flag, очевидно, не стандартный тип данных SQL Server.Простое решение состоит в том, чтобы удалить этот метод конфигурации.

Однако эти столбцы, очевидно, должны быть логическими флагами, и вы должны использовать соответствующий тип данных.Это означает, что в C # ваш тип - bool, а в SQL Server - bit.Например, ваша таблица будет выглядеть примерно так:

CREATE TABLE Products
(
    -- Other columns
    Primary BIT,
    Deleted BIT
)

, а ваш класс C # -

public class Product
{
    // Snip other columns
    public bool Primary { get; set; }
    public bool Deleted { get; set; }
}
...