Столбец EF core 3.0 Identity и ValueConverter - PullRequest
0 голосов
/ 20 января 2020

Это моя сущность:

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 столбец : BigInt и AutoIncrement

При добавлении миграции я получаю следующую ошибку:

Невозможно использовать значение идентификатора для свойства 'Pk' в типе сущности 'Аудит' потому что тип свойства - «строка». Генерация значения идентичности может использоваться только с целочисленными свойствами со знаком.

Любое решение?

Ответы [ 2 ]

1 голос
/ 20 января 2020

Лично говоря, string не является распространенным типом данных для primary key. Большую часть времени мы используем int или GUID. для решения вашей проблемы вы можете использовать приведенный ниже фрагмент:

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

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


   .  
   .
   .
}

И, наконец, удалите весь связанный код свойства Pk из вашего сопоставления

1 голос
/ 20 января 2020

Хранение первичного ключа bigint проще для ваших SQL таблиц. В противном случае измените ваш первичный ключ 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; }
}
...