具有数据类型前缀的列导致“类型X不是定义的系统类型”错误

时间:2018-07-11 08:19:05

标签: c# tsql entity-framework-core sql-server-2014

我正在使用第三方数据库。通常,我用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 数据类型:

enter image description here

带有 strage 的意思是,它们在这里像前缀EnumerationCurrencyCode: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 选项可以解决此问题?

1 个答案:

答案 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并将其绑定到列,但是现在您要在多个位置分发此定义,并且不建议使用规则。