У меня есть проблема, когда внутри класса я хочу обновить или добавить строку в зависимости от записи, существующей внутри БД.В этом, вместо того, чтобы иметь методы «Create / Update», у меня есть метод «Save (entity)».
Идея состоит в том, что сущность проверяется по базе данных, если она существует, то это обновление, если она неТогда это, очевидно, создание.
При использовании 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();
}
Мой вопрос - это типичный маршрут?или есть много умнее / чище?