实体框架核心 2.1 System.Data.SqlClient.SqlException (0x80131904):T



升级到实体框架2.1.11后,我面临以下问题。

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

我收到 Linq 到 SQL 内部翻译的错误。数据库表中有两列是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中的一个错误。谁能帮我解决这个问题?

根据大卫的评论添加了其他信息。 1)我没有为此创建任何自定义类型,也没有丢失。 2) C# 数据类型为 pl 的字节。初级和 pl。删除。 3)在dbContext中,我在onModelCreate方法中看到以下内容。 实体。属性(e => e.主要)。HasColumnType("Flag"); 实体。属性(e => e.已删除)。HasColumnType("Flag");

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

问题是您的属性的配置中HasColumnType("Flag")。这告诉实体框架列的类型是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; }
}

相关内容

最新更新