减少 EF Core 字符串鉴别器列大小以允许建立索引

Tom*_*mFp 7 sql-server entity-framework-core

我的 EF Core 鉴别器列是这样创建的

modelBuilder.Entity<MyClass>()
 .HasDiscriminator<string>("MyDiscriminator")
 .HasValue<SubClass1>(nameof(SubClass1))
 .HasValue<SubClass2>(nameof(SubClass2))
  ... etc. 
Run Code Online (Sandbox Code Playgroud)

属性 MyDiscriminator 未在 MyClass 上定义 - 它会自动添加,但是创建的 SQL 表将 MyDisciminator 列定义为 nvarchar(max) 鉴别器列中的值只能来自定义的列表,即“SubClass1”、“SubClass2” ETC。

如果我尝试对鉴别器列进行索引,我会得到

Msg 1919, Level 16, State 1, Line 29
Column 'MyDiscriminator' in table 'dbo.MyClass' is of a type that is invalid for use as a key column in an index.
Run Code Online (Sandbox Code Playgroud)

有没有什么方法可以定义字符串鉴别器,以便可以将最大长度设置为更合理的值 - 并且可以建立索引?

或者,如果没有,使用类似的方法在数据库中手动更改它是否会存在任何陷阱

ALTER TABLE dbo.MyClass
   ALTER COLUMN MyDiscriminator nvarchar(50)
Run Code Online (Sandbox Code Playgroud)

Iva*_*oev 9

HasDiscriminator配置鉴别器 CLR(影子或常规)属性名称、类型和关联值。相应的数据库列名称、类型、约束等的配置与任何其他属性一样 - 具有一些Property构建器重载。

例如,您可以在配置鉴别器属性的代码后添加以下内容:

// Set discriminator column type to varchar(50)
modelBuilder.Entity<MyClass>()
    .Property("MyDiscriminator")
    .IsUnicode(false)
    .HasMaxLength(50);

// Create index 
modelBuilder.Entity<MyClass>()
    .HasIndex("MyDiscriminator")
Run Code Online (Sandbox Code Playgroud)