【问题标题】:Entity Framework sql_variant as primary key实体框架 sql_variant 作为主键
【发布时间】:2021-05-02 09:32:08
【问题描述】:

对于一个项目,我使用 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' 将 'object' 包装成可以比较的类型。'

所以我尝试了很多将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; }
}

【问题讨论】:

  • 修复问题,如原始错误消息所述。请参阅:docs.microsoft.com/en-us/ef/core/modeling/…
  • 我已经尝试了几个这样的 ValueConversions,但在这种情况下似乎没有一个有效。然后我继续收到第二条错误消息。

标签: c# entity-framework sql-variant


【解决方案1】:

为了使转换工作我不得不注释掉:

.HasColumnType("sql_variant")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多