Entity Framework sql_variant 作为主键

Entity Framework sql_variant as primary key

对于一个项目,我使用 EF Core 5.0 搭建现有数据库。

数据库中有一些表有 sql_variant 列作为主键的一部分。

模型将 属性 创建为 'object'。

这个 属性 的基础 OnModelCreating:

  entity.Property(e => e.OperationNo)
    .HasColumnType("sql_variant")
    .HasColumnName("Operation No_");

当我尝试测试这个自动脚手架时,我收到错误消息:

'Property 'ProdOrderRoutingLine.OperationNo' cannot be used as a key because it has type 'object' which does not implement 'IComparable', 'IComparable' or 'IStructuralComparable'. Use 'HasConversion' in 'OnModelCreating' to wrap 'object' with a type that can be compared.'

所以我尝试了很多转换 sql_variant 到字符串或对象或...与比较器。为简单起见,我将尝试将其转换为具有默认比较器的字符串。

 entity.Property(e => e.OperationNo)
   .HasColumnType("sql_variant")
   .HasColumnName("Operation No_")
   .HasConversion<string>(str => str.ToString(), sql => sql.ToString());

在这里我将 属性 更改为 string 如果我将其保留为 object 我会得到同样的错误:

'The property 'ProdOrderRoutingLine.OperationNo' is of type 'string' which is not supported by the current database provider. Either change the property CLR type, or ignore the property using the '[NotMapped]' attribute or by using 'EntityTypeBuilder.Ignore' in 'OnModelCreating'

有什么想法可以解决这个问题并使用现有的 sql_variant 作为部分主键吗?

OnModelCreate 主键:

entity.HasKey(e => new { e.Status, e.ProdOrderNo, e.RoutingReferenceNo, e.RoutingNo, e.OperationNo });

部分模特:

public partial class ProdOrderRoutingLine
{
    public byte[] Timestamp { get; set; }
    public int Status { get; set; }
    public string ProdOrderNo { get; set; }
    public int RoutingReferenceNo { get; set; }
    public string RoutingNo { get; set; }
    public object OperationNo { get; set; }
    public string NextOperationNo { get; set; }
    public string PreviousOperationNo { get; set; }
    public int Type { get; set; }
    public string No { get; set; }
}

为了使转换有效,我不得不注释掉:

.HasColumnType("sql_variant")