Не отслеживание одного свойства объекта с помощью EF4

Мой метод действия MVC получает объект сущности (страницу), который связыватель модели по умолчанию создает из данных коллекции форм. Некоторые поля неверны или пусты, потому что они не были отправлены в запросе на сервер, например, я не отправляю «CreateDate», а связыватель модели по умолчанию устанавливает для этого свойства какое-то значение по умолчанию, которое мне не нужно.

Как только объект прикреплен, он, конечно, пытается сохранить все значения (включая недопустимые/ненужные) в базе данных. Я мог бы, конечно, назначать вручную для каждого свойства, но мне было интересно, могу ли я как-то пометить свойство, чтобы оно не сохранялось, когда EntityState настроен на изменение и вызывается SaveChanges()..

public ActionResult SomeMethod(Page page)
{
page.ModifyDate = DateTime.Now;

       _db.NewsPages.Attach(page);
                _db.ObjectStateManager.ChangeObjectState(page, System.Data.EntityState.Modified);
                _db.SaveChanges();
                _db.Dispose();

}

person LaserBeak    schedule 09.07.2012    source источник
comment
Почему вы не используете модели представления? В правильно спроектированном контроллере приложения действия должны принимать в качестве аргументов модели представления, а не модели предметной области. Затем сопоставьте модель представления с моделью предметной области и сохраните.   -  person Darin Dimitrov    schedule 09.07.2012


Ответы (1)


Правильный способ справиться с этим - использовать другой класс для модели представления, прикрепить пустой объект к контексту и назначить реальные значения для каждого свойства (или позволить AutoMapper обработать этот сценарий), как предложено @Darin в комментарии.

Если вы хотите пойти своим путем, вы не должны изменять состояние объекта POCO, но вы должны изменить состояние каждого измененного свойства:

public ActionResult SomeMethod(Page page)
{
    page.ModifyDate = DateTime.Now;

    _db.NewsPages.Attach(page);
    ObjectStateEntry entry = _db.ObjectStateManager.GetObjectStateEntry(page);
    entry.SetModifiedProperty("ChangedPropertyName");
    // Do the same for all other changed properties
    _db.SaveChanges();
    _db.Dispose();
}
person Ladislav Mrnka    schedule 09.07.2012