Repository.Update стратегия с использованием EF4 Code First? - PullRequest
1 голос
/ 14 декабря 2010

Я работаю на сайте MVC с Entity Framework Code First, использую 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");
}

Repository:

    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);
    }

Repository:

    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 Ответ

1 голос
/ 05 февраля 2011

Первый способ лучше.Если вы сохраните метод SaveChanges () в своем собственном методе Repository, вы можете внести множество изменений, а затем попытаться зафиксировать их все сразу, используя Update ().Если есть проблема с одним редактированием, все ваши изменения будут отменены при вызове Update ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...