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")
对于一个项目,我使用 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")