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

Bre*_*ogt 1 entity-framework entity-framework-4 entity-framework-4.1 asp.net-mvc-3

我正在使用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
   }
}
Run Code Online (Sandbox Code Playgroud)

我的存储库类:

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

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

   public void Save()
   {
      db.SaveChanges();
   }
}
Run Code Online (Sandbox Code Playgroud)

控制器类:

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());
}
Run Code Online (Sandbox Code Playgroud)

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

Sla*_*uma 5

在您的存储库中:

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

然后在您的服务中:

public void Update(Tutorial tutorial)
{
    tutorialRepository.UpdateScalar(tutorial);
    tutorialRepository.Save();
}
Run Code Online (Sandbox Code Playgroud)

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

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