#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;
}