Проблема при добавлении сущности с Id = 0 в провайдере EntityFramworkCore.InMemory - PullRequest
0 голосов
/ 21 ноября 2018

Следующее исключение кода выдает:

System.InvalidOperationException: экземпляр типа сущности 'DimEntity' не может быть отслежен, потому что другой экземпляр с тем же значением ключа для {'EntityEntityId'} уже отслеживается,При присоединении существующих сущностей убедитесь, что прикреплен только один экземпляр сущности с данным значением ключа

var optionsBuilder = new DbContextOptionsBuilder<MyDbContext>();
optionsBuilder.UseInMemoryDatabase("Test");
using (var dbContext = new MyDbContext(optionsBuilder.Options))
{
    //when I comment this line, the rest works file
    dbContext.DimEntity.Add(new DimEntity { EntityEntityId = 0, EntityKey = "Uknown" });


    //otherwise this line throws the exception
    dbContext.DimEntity.Add(new DimEntity { EntityEntityId = 1, EntityKey = "DFS Region" });
    = "Europe Region" }); 
   dbContext.DimEntity.Add(new DimEntity { EntityEntityId = 2, EntityKey = "Europe Region" });
}

Почему?

Дополнительные сведения:

public partial class MyDbContext : DbContext
{
    public MyDbContext (DbContextOptions<MyDbContext> options)
        : base(options)
    {
    }

    public virtual DbSet<DimEntity> DimEntity { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<DimEntity>(entity =>
        {
            entity.HasKey(e => e.EntityEntityId);
            entity.ToTable("DimEntity", "mm");
            entity.Property(e => e.EntityEntityId).HasColumnName("Entity_EntityID");
        });
    }
}

public partial class DimEntity
{
    public int EntityEntityId { get; set; }
    public string EntityKey { get; set; }
}

1 Ответ

0 голосов
/ 21 ноября 2018

Это не зависит от поставщика памяти.По соглашению int PK считаются автоинкрементами (SqlServer identity), поэтому проблема похожа на добавление явных значений в колонку автоинкремента.

Если вы сохраните new DimEntity { EntityEntityId = 0, ... } в переменной, вы увидите, что после Add значение EntityEntityId будет равно 1 (потому что, когда значение PK является значением по умолчанию (0 для int)), генерация значения при добавлении выполняется).

Но при добавлении сущности с нестандартным int PK генерация значения не происходит, и исключение выдается для EntityEntityId = 1, посколькуоно уже существует - сгенерированное значение для первой сущности, которую вы добавили первым.

В общем, если вы не хотите генерировать значения PK, вы должны подписаться на это внутри OnModelCreating:

entity.Property(e => e.EntityEntityId)
    .HasColumnName("Entity_EntityID")
    .ValueGeneratedNever(); // <--
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...