繁体   English   中英

实体框架 sql_variant 作为主键

[英]Entity Framework sql_variant as primary key

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

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

model 将该属性创建为“对象”。

OnModelCreating这个属性:

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

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

'ProdOrderRoutingLine.OperationNo' 属性不能用作键,因为它具有不实现 'IComparable'、'IComparable' 或 'IStructuralComparable' 的类型 'object'。 使用 'OnModelCreating' 中的 'HasConversion' 将 'object' 包装为可以比较的类型。

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

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

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

'ProdOrderRoutingLine.OperationNo' 属性是当前数据库提供程序不支持的'string' 类型。 更改属性 CLR 类型,或使用“[NotMapped]”属性或使用“OnModelCreating”中的“EntityTypeBuilder.Ignore”忽略该属性

任何想法如何克服这个问题并将现有的sql_variant用作部分主键?

OnModelCreate主键:

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

Model 的一部分:

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")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM