У меня проблема, когда внутри класса я хочу обновить или добавить строку в зависимости от записи, существующей внутри БД. В этом случае вместо методов «Создать/обновить» у меня есть метод «Сохранить (сущность)».
Идея заключается в том, что объект проверяется по базе данных, если он существует, то это обновление, если нет, то, очевидно, это создание.
При использовании EF 4.1 проблема заключается в том, что как только я читаю строку из базы данных через тот же контекст, это, в свою очередь, создает кеш памяти этой строки. Когда я затем попытаюсь заменить строку, скажем, с помощью процедуры присоединения/добавления, она, очевидно, вызовет исключение для уже существующей строки и т. д. (поскольку она пытается принудительно поместить как currentRow, так и newRow в одну и ту же таблицу и терпит неудачу при согласовании).
Мой обходной путь для этого заключается в том, чтобы использовать .Remove() в контексте, который помечает строку для удаления из памяти, а затем повторно добавляет ее в ту же транзакцию USING.
var ctx = new SecurityContext(this.ConnectionString);
using(ctx)
{
var dbEntry = (ctx.Accounts.Where(a => a.AccountId == entity.AccountId || a.Username == entity.Username)).FirstOrDefault();
ctx.Accounts.Remove(dbEntry);
if (dbEntry != null)
{
ctx.Entry(entity).State = EntityState.Added;
} else
{
ctx.Accounts.Add(entity);
ctx.Entry(entity).State = EntityState.Added;
}
ctx.SaveChanges();
}
Мой вопрос: это типичный маршрут? или есть более умные/чистые способы?