实体框架4.1代码优先:通过服务层添加和更新记录

时间:2011-06-06 12:06:38

标签: entity-framework asp.net-mvc-3 entity-framework-4 entity-framework-4.1

我正在使用Entity Framework 4.1 Code First和ASP.NET MVC 3。

我有一个服务类,在这个类中我调用了我的存储库方法。

我添加了一个新的教程对象,我只是不知道如何更新记录。这是我对服务的插入和更新方法:

public class TutorialService : ITutorialService
{
   private ITutorialRepository tutorialRepository;

   public TutorialService(ITutorialRepository tutorialRepository)
   {
      this.tutorialRepository = tutorialRepository;
   }

   public void Insert(Tutorial tutorial)
   {
      tutorialRepository.Add(tutorial);
      tutorialRepository.Save();
   }

   public void Update(Tutorial tutorial)
   {
      // Not sure what the code looks like here to call the repo methods
   }
}

我的存储库类:

public class TutorialRepository : ITutorialRepository
{
   PbeContext db = new PbeContext();

   public void Add(Tutorial tutorial)
   {
      db.Tutorials.Add(tutorial);
   }

   public void Save()
   {
      db.SaveChanges();
   }
}

控制器类:

public ActionResult Edit(EditTutorialViewModel editTutorialViewModel)
{
   // Other code

   if (!ModelState.IsValid)
   {
      return View("Edit", editTutorialViewModel);
   }

   // Mapping code here to Tutorial object
   Tutorial tutorial = (Tutorial)tutorialMapper.Map(editTutorialViewModel, typeof(EditTutorialViewModel), typeof(Tutorial));

   // Update the existing tutorial
   tutorialService.Update(tutorial);

   return RedirectToRoute(Url.TutorialList());
}

更新代码会是什么样的?有没有更简单的方法呢?

2 个答案:

答案 0 :(得分:5)

在您的存储库中:

public void UpdateScalar(Tutorial tutorial)
{
    var original = db.Tutorials.Find(tutorial.ID);
    db.Entry(original).CurrentValues.SetValues(tutorial);
}

然后在你的服务中:

public void Update(Tutorial tutorial)
{
    tutorialRepository.UpdateScalar(tutorial);
    tutorialRepository.Save();
}

Tigger的解决方案也有效,并且具有在更新之前无需加载原件的好处。另一方面,将状态设置为Modified会强制所有属性在UPDATE语句中发送到DB,无论它们是否更改。上面的解决方案只将更改的属性发送到DB,但需要在之前加载原始文件。

两种解决方案仅适用于标量属性。一旦涉及更复杂的对象图和导航属性,更新就会变得更加复杂。

答案 1 :(得分:4)

您可以在存储库类中对插入和更新使用相同的save方法,例如

public void Save(Tutorial tutorial)   
{   
   db.Entry(tutorial).State = tutorial.Id == 0
                                     ? EntityState.Added
                                     : EntityState.Modified;

   db.SaveChanges();   
}