【问题标题】:Entity Framework 4.1 Code First: Adding and updating records through a service layerEntity Framework 4.1 Code First:通过服务层添加和更新记录
【发布时间】:2011-06-06 12:06:37
【问题描述】:

我正在使用 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());
}

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

【问题讨论】:

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


    【解决方案1】:

    在您的存储库中:

    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 语句中发送到数据库,无论它们是否更改。上面的解决方案只是将更改后的属性发送到数据库,但需要先加载原始属性。

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

    【讨论】:

    • 谢谢。当 EF 为您创建 SQL 语句时,是否有时会出现性能问题?你能微调这些吗?
    • 与原来的问题没有太大关系,但是 Find 和 Get 有什么区别?
    • @Brendan Vogt:您几乎被 EF 生成的 SQL 语句所束缚。你无法控制它。虽然有直接向服务器发送手写 SQL 命令的选项,但它仅适用于非常特殊的情况。对于“正常”的 CRUD 操作,我会使用 EF 生成的 SQL。 “获取”是什么意思? Find 通过其键加载对象,如果已加载,则仅返回对上下文中对象的引用。它不适合一般查询。在这种情况下,通常使用带有 Where 运算符的 LINQ 查询。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-15
      • 2011-08-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多