使用EF4 Code First的Repository.Update策略?

时间:2010-12-14 15:53:20

标签: entity-framework design-patterns asp.net-mvc-3

我正在使用实体框架代码优先的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();
        }
    }

哪种方式更可取,还是有另一种更好的方式?

1 个答案:

答案 0 :(得分:1)

第一种方式更好。如果将SaveChanges()方法保存在自己的Repository方法中,则可以进行许多编辑,然后尝试使用Update()一次性提交它们。如果一次编辑出现问题,则在调用Update()时将回滚所有更改。