Entity Framework Core 2.1 System.Data.SqlClient.SqlException (0x80131904): Type Flag 不是定义的系统类型

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

升级到 EntityFramework 2.1.11 后,我面临以下问题。

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

我在 Linq 到 SQL 内部翻译时收到此错误。数据库 table 中有两列是 tinyint 数据类型,对应的 C# 数据类型是字节,这在查询时在 Linq 中抛出异常。

原因是 column == 1 在 2.1 内部被翻译为 CAST(1 AS Flag),它在 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 中的错误。谁能帮我解决这个问题?

根据 David 的评论添加了其他信息。 1)我没有为此创建任何自定义类型并且没有丢失。 2) 对于 pl.Primary 和 pl.Deleted,C# 数据类型是字节。 3) 在 dbContext 中,我在 onModelCreating 方法中看到以下内容。 entity.Property(e => e.Primary).HasColumnType("Flag"); entity.Property(e => e.Deleted).HasColumnType("Flag");

注意:DbContext 是较早使用 .net core 2.0 生成的,并且没有对其进行任何代码更改。

问题是您的属性配置中有 HasColumnType("Flag")。这告诉 Entity Framework 列的类型是 Flag,显然不是标准的 SQL 服务器数据类型。简单的解决方案是删除该配置方法。

但是,这些列显然是布尔标志,您应该使用适当的数据类型。这意味着在 C# 中你的类型是 bool 而在 SQL Server 中它是 bit。例如,您的 table 看起来像这样:

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

你的 C# class 像这样

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