Как удалить запись в DBContext, когда эта сущность уже сохранена в базе данных EF Core - PullRequest
0 голосов
/ 04 августа 2020

У меня проблема с записями dbcontext.

У меня есть 2 объекта, которые нужно сохранить в базе данных с помощью EF Core. EntityA EntityB

EntityA уже сохранен в базе данных, а EntityB нет.

Когда я вызываю свой код в SaveChanges EntityA, у меня появляется ошибка Дублирующая запись '7c4e4552-c46f-4153-b1e8-c9ebfca135a4 'для ключа' PRIMARY ', нормально, тогда я хочу сохранить EntityB, но когда я вызываю свой SaveChanges, я вижу, что у меня есть 2 записи в моей коллекции записей DBContext, и я не могу сохранить EntityB, потому что EF пытается снова для сохранения EntityA.

public async Task<TEntity> AddAsync(TEntity entity)
{
    if (entity == null)
    {
        throw new ArgumentNullException($"{nameof(AddAsync)} entity must not be null");
    }

    try
    {
        await Context.AddAsync(entity);
        await Context.SaveChangesAsync();
        return entity;
    }

    catch (Exception ex)
    {
        throw new Exception($"{nameof(entity)} could not be saved. {errorMessage}");
    }
}


public override async Task<int> SaveChangesAsync(CancellationToken cancellationToken = default(CancellationToken))
        {
            // Get all the entities that inherit from AuditableEntity
            // and have a state of Added or Modified
            var entries = ChangeTracker
                .Entries()
                .Where(e => e.Entity is AuditableEntity && (
                        e.State == EntityState.Added
                        || e.State == EntityState.Modified));

            // For each entity we will set the Audit properties
            foreach (var entityEntry in entries) ***//Here are 2 when I only want 1***
            {
                // If the entity state is Added let's set
                // the CreatedAt and CreatedBy properties
                if (entityEntry.State == EntityState.Added)
                {
                    ((AuditableEntity)entityEntry.Entity).CreatedAt = DateTime.UtcNow;
                    ((AuditableEntity)entityEntry.Entity).CreatedBy = _httpContextAccessor?.HttpContext?.User?.Identity?.Name ?? MyApp;
                }
                else
                {
                    // If the state is Modified then we don't want
                    // to modify the CreatedAt and CreatedBy properties
                    // so we set their state as IsModified to false
                    Entry((AuditableEntity)entityEntry.Entity).Property(p => p.CreatedAt).IsModified = false;
                    Entry((AuditableEntity)entityEntry.Entity).Property(p => p.CreatedBy).IsModified = false;
                }

                // In any case we always want to set the properties
                // ModifiedAt and ModifiedBy
                ((AuditableEntity)entityEntry.Entity).ModifiedAt = DateTime.UtcNow;
                ((AuditableEntity)entityEntry.Entity).ModifiedBy = _httpContextAccessor?.HttpContext?.User?.Identity?.Name ?? MyApp;
            }

            // After we set all the needed properties
            // we call the base implementation of SaveChangesAsync
            // to actually save our entities in the database
            return await base.SaveChangesAsync(cancellationToken);
        }

1 Ответ

0 голосов
/ 04 августа 2020

Включили ли вы миграцию кода в своем проекте?

Если нет, вы видите эту ошибку, потому что EF пытается снова создать EntityA, поскольку вы не включили миграции кода. Миграция кода будет постепенно обновлять данные чтобы синхронизировать его c с моделью данных приложения при сохранении существующих данных в базе данных. Чтобы добавить миграции, перейдите по ссылке ниже. Учебник MSDN

...