Я разрабатываю приложение MVC4, используя .Net4.5, EF5 и MSSQL 2008R2. Я использую Db Context и автоматически сгенерированные классы/модели сущностей и шаблон Unit of Work.
Когда я пытаюсь обновить запись таблицы с помощью метода Edit ActionResult, запись удаляется, когда обновленные данные изначально были нулевыми, например, добавление отчества.
Я могу проследить объект от ActionResult до GenericRepository до UnitOfWork Save(), где вызывается контекст db savechanges(). Данные есть до тех пор. После этого я не уверен, как его отлаживать.
Таким образом, любая помощь в отладке или решении этой проблемы будет оценена по достоинству. Я могу успешно создавать и удалять записи таблицы. Я также пытался просто использовать контекст db в Edit ActionResult с теми же результатами удаления. Я протестировал сопоставленную хранимую процедуру, которая корректно обновилась.
[HttpPost]
public ActionResult Edit(v_Demographics vm)
{
try
{
if (ModelState.IsValid)
{
unitOfWork.DemographicsRepository.Update(vm);
unitOfWork.Save();
//db.Entry(vm).State = EntityState.Modified;
//db.SaveChanges();
return RedirectToAction("Index");
}
}
catch (DataException)
{
//Log the error (add a variable name after DataException)
ModelState.AddModelError("", "Unable to save changes. Try again, and if the problem persists see your system administrator.");
}
return View(vm);
}
public class GenericRepository<TEntity> where TEntity : class
{
internal SEntities db = new SEntities();
internal DbSet<TEntity> dbSet;
public GenericRepository(AIPIMSEntities db)
{
this.db = db;
this.dbSet = db.Set<TEntity>();
}
public virtual void Update(TEntity entityToUpdate)
{
dbSet.Attach(entityToUpdate);
db.Entry(entityToUpdate).State = EntityState.Modified;
}
}
public class UnitOfWork : IDisposable
{
private AIPIMSEntities db = new AIPIMSEntities();
private GenericRepository<v_Demographics> demographicsRepository;
public GenericRepository<v_Demographics> DemographicsRepository
{
get
{
if (this.demographicsRepository == null)
{
this.demographicsRepository = new GenericRepository<v_Demographics>(db);
}
return demographicsRepository;
}
}
public void Save()
{
db.SaveChanges();
}
private bool disposed = false;
protected virtual void Dispose(bool disposing)
{
if (!this.disposed)
{
if (disposing)
{
db.Dispose();
}
}
this.disposed = true;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}