entity-framework-core-2.1 - 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 生成的,并且没有对其进行任何代码更改。
解决方案
问题是您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; }
}
推荐阅读
- localserver - 无法在 Ampps 3.9 中创建新域
- javascript - ReactJs 向这个按钮添加类
- xslt-1.0 - 如何在 xslt 中使用 GrandChild 的值
- c# - 为什么 C# Task.Run() 方法在控制台应用程序的循环中打印相同的数字?
- javascript - 如何在php中获取所有文件目录和子目录名称作为json对象
- microsoft-graph-api - 通过 api 获取/放置微软 ToDo 任务的步骤
- r - R从文件夹Mac Catalina OS加载文件
- oracle - pentaho 报表设计器中某个月份的天数
- c# - ClickOnce 名称、发布者和域。它是什么?
- haskell - 如何制作约束蕴涵函数(||-)?(关联类型同义词)