我正在使用实体框架代码优先的MVC网站,使用Ninject为控制器提供DI,我遇到了一个设计问题。我见过两种用于Code First更新的方法。第一个使用“get by id”,更改返回对象的值,然后调用Context.SaveChanges()
,如下所示:
控制器:
[HttpPost]
public ActionResult Edit(int id, FormCollection collection)
{
//Create a vm to hold the data from the form.
var sectionVm = new SectionEditViewModel();
//Copy the data from the http header to the object.
UpdateModel(sectionVm);
//Get the object from the database.
//_sectionRepository is injected in to the constructor.
var section = _sectionRepository.GetById(sectionVm.SectionId);
//Map from the view model to the actual model.
var viewSection = Mapper.Map(sectionVm, section);
_sectionRepository.Update();
return RedirectToAction("Index");
}
存储库:
public void Update()
{
_context.SaveChanges();
}
第二种方法创建模型对象,将其附加到上下文,更改对象的状态,然后调用SaveChanges()
。这里以消费者的测试方法为例进行说明:
测试:
[TestMethod]
public void CanUpdateSection()
{
var repo = new SectionRepository();
var testSection = GetMockSection();
testSection.SomeProperty = "A new value";
testContact.AnotherProperty = "Another new value";
repo.Update(testSection);
var persistedUpdatedSection = repo.GetById(testSection.Id);
Assert.IsNotNull(persistedUpdatedSection);
CompareSections(testSection, persistedUpdatedSection);
}
存储库:
public void Update(Section entity)
{
using(var context = new SectionContext())
{
context.Sections.Attach(entity);
context.Entry(entity).State = System.Data.EntityState.Modified;
context.SaveChanges();
}
}
哪种方式更可取,还是有另一种更好的方式?
答案 0 :(得分:1)
第一种方式更好。如果将SaveChanges()方法保存在自己的Repository方法中,则可以进行许多编辑,然后尝试使用Update()一次性提交它们。如果一次编辑出现问题,则在调用Update()时将回滚所有更改。