Reputation: 18734
I'm working with a 3rd party database. Usually queries that I write in LINQPad and later translate to Entity Framework Core (2.1) work without any issues. However, not this time.
When I try to use the column Status
I'm getting the following 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
so I opend the SQL Server Management Studio and found that this column (and few others) use strage data-types:
with strage I mean they are prefixed like here with Enumeration
or CurrencyCode:varchar(3)
etc.
I used EF-Core scaffolding to create the entities and the property is defined as:
public short Status { get; set; }
which looks fine but the EF-Core engine apparently recognized the Enumeration
prefix and generated this line in the OnModelCreating
method:
entity.Property(e => e.Status).HasColumnType("Enumeration");
and I guess this is causing the error.
I've never seen this before and I'm wondering why is EF-Core failing to query such columns whereas LINQPand isn't and what are those strange data-types?
Is there any magic or secret option for EF-Core to fix this issue?
Upvotes: 0
Views: 392
Reputation: 239804
Why it's showing up like this is because you're using a User-Defined Data Type. This script reproduces the issue:
create type Enumeration from smallint null
go
create table T (
ID int not null,
E Enumeration not null
)
How you've ended up in this situation I couldn't say. Most people I know (I appreciate this is just opinion) shun the User-defined types in SQL Server (other that User-defined table types) because they only half work to start with.1
1E.g. a useful feature for user-defined table types would be if you could apply specific constraints automatically - a number that can only fall in the range 1-100 say. You cannot do this with the UDT system. You can separately create RULE
s and bind those to columns but you're now distributing this definition in multiple places and rules are deprecated anyway.
Upvotes: 1