首页 > 解决方案 > Entity Framework Core 2.1 System.Data.SqlClient.SqlException (0x80131904):类型标志不是定义的系统类型

问题描述

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

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

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

原因是在 2.1 内部column == 1 翻译为在 2.0 中工作。CAST(1 AS Flag)

如果我们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# 数据类型为 Byte。3) 在 dbContext 中,我在 onModelCreating 方法中看到以下内容。entity.Property(e => e.Primary).HasColumnType("Flag"); entity.Property(e => e.Deleted).HasColumnType("Flag");

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

标签: entity-framework-core-2.1entity-framework-core-migrations

解决方案


问题是您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; }
}

推荐阅读