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; }
}
升级到 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; }
}