Entity Framework DbSet.Add (сущность) генерирует ту же инструкцию insert, хотя я предоставляю разные значения со второй попытки

#entity-framework

#entity-framework

Вопрос:

Я тестирую свой класс репозитория по следующему сценарию:

Сначала я вызываю

 Insert(TEntity entity)
  

с уже существующей сущностью. Это работает хорошо, EF выдает мне ошибку дублирования ключа, что нормально.

После этого я повторно выполняю вызов

 Insert(TEntity entity)
  

но теперь с другими данными; но EF генерирует ту же инструкцию SQL, что и в предыдущем вызове.

 public class EfRepository<TEntity> : IRepository<TEntity>
        where TEntity : Entity
{
    protected EcmsDbContext Context;
    internal DbSet<TEntity> DbSet;


    public EfRepository(EcmsDbContext context)
    {
        Context = context;
        DbSet = Context.Set<TEntity>();
    }

    public virtual async Task<bool> Insert(TEntity entity)
    {
        try
        {
            DbSet.Add(entity);
            return await Context.SaveChangesAsync() > 0;
        }
        catch (Exception e)
        {
            return false;
        }
    }
}
  

Комментарии:

1. Вопросы, обращающиеся за помощью по отладке («почему этот код не работает?»), должны включать желаемое поведение, конкретную проблему или ошибку и кратчайший код, необходимый для ее воспроизведения в самом вопросе. Мы не знаем, как выглядят ваши вызовы Insert() , поэтому мы не можем повторить вашу проблему.

2. Если вы тестируете две разные вещи (повторяющаяся вставка, недвойственная вставка), то почему есть First и After ? Разве два теста не должны работать независимо друг от друга?

Ответ №1:

Если вы пытаетесь выполнить insert, то в качестве обработчика исключений пытаетесь выполнить insert с новой, скорректированной сущностью, если вы не удалили DbContext или не отсоединили первоначально добавленную сущность, та же самая «первая» сущность все равно будет пытаться сохранить.

Я считаю, что это должно сработать:

 try
{
    DbSet.Add(entity);
    return await Context.SaveChangesAsync() > 0;
}
catch (Exception e)
{
    Context.Entry(entity).State = EntityState.Detached;
    return false;
}