Identity для Entity Framework Core
От: varenikAA https://blevaka.blogspot.com/
Дата: 27.05.21 07:12
Оценка:
Реализовал такой класс:
 public struct Identity
    {
        readonly int value;
        public Identity(int value) => this.value = value;
        public static implicit operator Identity(int value) => new Identity(value);
        public static bool operator ==(Identity a, Identity b) => a.value == b.value;
        public static bool operator !=(Identity a, Identity b) => a.value != b.value;
        public static bool operator >=(Identity a, Identity b) => a.value >= b.value;
        public static bool operator <=(Identity a, Identity b) => a.value <= b.value;
        public static implicit operator int(Identity id) => id.value;
        public override bool Equals(object obj)
        {
            if (obj is Identity id)
                return id.value == this.value;
            return false;
        }

        public override int GetHashCode()
        {
            return value.GetHashCode();
        }
    }

    public class DataContext : DbContext
    {
        public DbSet<Person> Persons { get; set; }
        protected override void OnConfiguring(DbContextOptionsBuilder options) => options.UseSqlite(@"Data Source=data.db");
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder
                .Entity<Person>()
                .Property(e => e.Id).HasColumnType("INT")
                .HasConversion(v => v, v => v);
        }
    }

    public record Person()
    {
        public Identity Id { get; set; }
        public string Name { get; set; }
    }


При попытке добавить миграцию, получаю сообщение:

The property 'Person.Id' is of type 'Identity' 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'.


У меня смутное подозрение, что это не обойти. я прав?

UPD:
            var converter = new ValueConverter<Identity, int>(v => (int)v, v => new Identity(v));
            modelBuilder
                .Entity<Person>()
                .Property(e => e.Id).HasColumnType("INTEGER")
                .HasConversion(converter);


Так скушал, но без указания Id не хочет сохранять.

Unhandled exception. System.InvalidOperationException: The instance of entity type 'Person' cannot be tracked because another instance with the same key value for {'Id'} is already being tracked. When attaching existing entities, ensure that only one entity instance with a given key value is attached. Consider using 'DbContextOptionsBuilder.EnableSensitiveDataLogging' to see the conflicting key values.


UPD2:
если сконфигурить с .ValueGeneratedOnAdd()

Unhandled exception. System.NotSupportedException: Value generation is not supported for property 'Person.Id' because it has a 'ValueConverter<Identity, int>' converter configured. Configure the property to not use value generation using 'ValueGenerated.Never' or 'DatabaseGeneratedOption.None' and specify explicit values instead.

Отредактировано 27.05.2021 7:31 varenikAA . Предыдущая версия . Еще …
Отредактировано 27.05.2021 7:24 varenikAA . Предыдущая версия .
Отредактировано 27.05.2021 7:12 varenikAA . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.