我正在使用第三方数据库。通常,我用LINQPad编写的查询,后来转换为Entity Framework Core(2.1),可以正常工作。但是,这次不是。
当我尝试使用列Status
时,我得到以下SqlException
:
Class 16 byte LineNumber 1 int Message "Type Enumeration is not a defined system type." string Number 243 int Procedure "" string Server "..." string Source ".Net SqlClient Data Provider" string State 2 byte
所以我打开SQL Server Management Studio,发现此列(及其他一些列)使用 strage 数据类型:
带有 strage 的意思是,它们在这里像前缀Enumeration
或CurrencyCode:varchar(3)
等。
我使用EF-Core脚手架创建了实体,并将该属性定义为:
public short Status { get; set; }
看起来不错,但EF-Core引擎显然识别出Enumeration
前缀,并在OnModelCreating
方法中生成了这一行:
entity.Property(e => e.Status).HasColumnType("Enumeration");
我想这是导致错误的原因。
我以前从未见过这种情况,我想知道为什么EF-Core不能查询这样的列,而LINQPand不是,这些奇怪的数据类型是什么?
EF-Core是否有 magic 或 secret 选项可以解决此问题?
答案 0 :(得分:1)
为什么之所以这样显示,是因为您使用的是用户定义的数据类型。该脚本重现了该问题:
create type Enumeration from smallint null
go
create table T (
ID int not null,
E Enumeration not null
)
如何您无法解决这种情况。我认识的大多数人(我很欣赏这只是意见)避免使用SQL Server中的用户定义类型(其他用户定义的 table 类型),因为它们开始时只有一半工作。 1
1 例如用户定义表类型的一个有用功能是,如果您可以自动应用特定的约束-这个数字只能在1-100范围内。您不能使用UDT系统执行此操作。您可以单独创建RULE
并将其绑定到列,但是现在您要在多个位置分发此定义,并且不建议使用和规则。