【问题标题】:EF core 3.0 Identity column and ValueConverterEF core 3.0 Identity 列和 ValueConverter
【发布时间】:2020-01-20 09:41:44
【问题描述】:

这是我的实体:

public class Audit
{
    public string Pk { get; set; }
    public string TableName { get; set; }
    public string RowPk { get; set; }
    public string ActionType { get; set; }
    public string RowContent { get; set; }
}

这是我的映射:

modelBuilder.Entity<Audit>(entity =>
{
    entity.HasKey(e => e.Pk).IsClustered(true);
    entity.Property(e => e.Pk)
    .ValueGeneratedOnAdd()
    .UseIdentityColumn()
    .HasConversion(new ValueConverter<string, long>(v => Convert.ToInt64(v),v => Convert.ToString(v)));

    entity.Property(e => e.TableName).IsRequired().HasMaxLength(255);
    entity.Property(e => e.RowPk).IsRequired().HasMaxLength(100);
    entity.Property(e => e.ActionType).IsRequired().HasMaxLength(1);
    entity.Property(e => e.RowContent).IsRequired;
});

我的要求:

Audit.Pk:string
PK列:BigIntAutoIncrement

添加迁移我得到以下错误:

标识值生成不能用于属性 'Pk' on 实体类型“审计”,因为属性类型是“字符串”。身份 值生成只能与有符号整数属性一起使用。

有什么解决方法吗?

【问题讨论】:

  • 我是否正确理解您想使用一列作为主键和外键?
  • 数据库如何自动增加string
  • DB column of type bigint not string 那是因为我使用转换器
  • 错误消息是关于 property 类型,而不是 db 列类型。考虑一下当前的 EF Core 限制/缺点 - 值生成器和值转换器不能一起使用。

标签: c# .net .net-core entity-framework-core


【解决方案1】:

就个人而言,string 不是primary key 的常用数据类型。大多数时候我们使用intGUID。为了解决您的问题,您可以使用以下 sn-p:

public class Audit
{
   [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
   public int Id { get; set; }  //instead of Pk 

   [NotMapped]
   public string Pk => Id.ToString();


   .  
   .
   .
}

最后,从您的映射中删除所有与 Pk 属性相关的代码

【讨论】:

    【解决方案2】:

    为您的 SQL 表保留一个 bigint 主键更容易维护。否则,请将您的主键 PK 更改为 GUID。

    否则,我建议对您的课程进行以下更改,即在您的程序中强制使用 PkString(此更改对您的数据库是透明的):

    public class Audit
    {
        [Key]
        public long Pk { get; set; }
    
        [NotMapped]
        public string PkString => Pk.ToString();
    
        public string TableName { get; set; }
    
        public string RowPk { get; set; }
    
        public string ActionType { get; set; }
    
        public string RowContent { get; set; }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-29
      • 2020-07-21
      • 2020-11-23
      • 2020-03-08
      • 2021-11-18
      • 1970-01-01
      • 2018-01-08
      • 1970-01-01
      相关资源
      最近更新 更多