对于一个项目,我使用 EF Core 5.0 来搭建现有数据库。
数据库有一些表,其中 sql_variant
列作为主键的一部分。
模型将属性创建为“对象”。
此属性的基础 OnModelCreating
:
entity.Property(e => e.OperationNo)
.HasColumnType("sql_variant")
.HasColumnName("Operation No_");
当我尝试测试这个自动脚手架时,我收到错误消息:
<块引用>'Property 'ProdOrderRoutingLine.OperationNo' 不能用作键,因为它的类型 'object' 没有实现 'IComparable'、'IComparable' 或 'IStructuralComparable'。在“OnModelCreating”中使用“HasConversion”将“对象”包装成可比较的类型。
所以我尝试了很多转换 sql_variant
到字符串或对象或 ... 与比较器。为简单起见,我将尝试将其转换为具有默认比较器的字符串。
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 });
模型的一部分:
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; }
}
答案 0 :(得分:0)
为了使转换工作,我必须注释掉:
.HasColumnType("sql_variant")