Обновление EntityFramework удаляет запись

Я разрабатываю приложение 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);
    }
}

person lv2rftak    schedule 10.05.2013    source источник
comment
может помочь, если бы мы могли видеть код универсального репозитория, так как это то, что делает обновление   -  person Chris McGrath    schedule 11.05.2013
comment
Крис, я поместил отредактированную версию в свой исходный пост. Вот неотредактированный общий репозиторий.   -  person lv2rftak    schedule 13.05.2013
comment
Крис, спасибо за помощь, но я обнаружил, что это проблема представления MSSQL. Это помогает иметь выходной.   -  person lv2rftak    schedule 13.05.2013
comment
вы должны добавить это как свой ответ и принять, чтобы закрыть вопрос   -  person Chris McGrath    schedule 13.05.2013


Ответы (1)


Как оказалось, ошибка удаления была вызвана представлением MSSQL. Код здесь основан на этом tutorial, и работает сейчас.

person lv2rftak    schedule 14.05.2013