2010-12-14 3 views
1

Ich arbeite an einer MVC-Site mit Entity Framework Code Zuerst mit Ninject für DI zu den Controllern, und ich bin auf eine Design-Frage gestoßen. Ich habe zwei Methoden für Updates mit Code First gesehen. Die erste verwendet eine "von id bekommen", ändert die Werte des Objekts zurückgegeben, ruft dann Context.SaveChanges(), wie folgt aus:Repository.Update-Strategie mit EF4-Code zuerst?

Controller:

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

Die zweite Methode Erstellt das Modellobjekt, hängt es an den Kontext an, ändert den Status des Objekts und ruft dann SaveChanges() auf. Illustriert wird hier mit einem Testverfahren, wie der Verbraucher: Test:

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

Welche Art und Weise zu bevorzugen ist, oder gibt es einen anderen, besseren Weg?

Antwort

1

Der erste Weg ist besser. Wenn Sie die SaveChanges() - Methode in ihrer eigenen Repository-Methode beibehalten, können Sie viele Änderungen vornehmen und dann versuchen, sie alle gleichzeitig mit Update() zu übernehmen. Wenn bei einer Bearbeitung ein Problem auftritt, werden alle Ihre Änderungen rückgängig gemacht, wenn Update() aufgerufen wird.