【问题标题】:Should i be calling Entity Framework SaveChanges once or individually after each change我应该在每次更改后调用一次还是单独调用 Entity Framework SaveChanges
【发布时间】:2016-06-19 07:37:57
【问题描述】:

我有一个名为 Party 的 ASP.NET MVC 控制器。在 CreateParty 视图中,用户可以输入 Party 信息并选择一些 Party User。

单击保存时,我将数据从控制器传递到名为 PartyService 的服务类,该类负责保存详细信息(我正在尝试使用 DDD 原则)。

public class PartyService
{
   public void SaveParty(PartyDTO party, List<UserDTO> users)
   {
       int pId = SaveSingleParty(party);

       foreach (UserDTO u in users)
       {
           SaveSinglePartyUser(u, pId);
       }

   }

   private int SaveSingleParty(PartyDTO party)
   {
       //open new context
       //add to Party repository
       //call save changes
       //close context
   }

   private void SaveSinglePartyUser(UserDTO user, int partyId)
   {
       //open new context
       //add to Party repository
       //call save changes
       //close context
   }
}

我对这段代码的担忧是创建了一个新的上下文来保存一个派对,然后为每个派对用户创建。我可以更改 SaveParty 方法,以便在其中执行所有操作(打开 1 个上下文并在调用 SaveChanges 之前进行所有更改)。

我从这两种方法中得到什么好处?我要指出的是,应用程序中可能只有 1 个地方用户可以创建派对和派对用户。

我是整个架构方面的新手,所以任何建议都将不胜感激。

【问题讨论】:

  • 您是否研究过 DDD 聚合?您的示例中的聚合是什么?

标签: c# asp.net-mvc entity-framework architecture domain-driven-design


【解决方案1】:

只需要一个上下文

1. to be opened
2. save related objects in a transaction 
3. and gets closed

也因为party和partyUsers对象是相关的(一对多关系)所以

1. you need to add user objects directly in party's user collection 
2. and add party object (which contains users collection) to context 
3. and call context.SaveChanges();

【讨论】:

    【解决方案2】:

    您应该为每个 ASP.NET 请求创建一个 DbContext。

    在您的情况下,SaveParty 创建上下文实例并使SaveSingleParty 和SaveSinglePartyUser 使用该实例创建和插入实体是有道理的,然后只有SaveParty 会调用@ 987654327@.

    优点是单个SaveChanges 调用将向数据库发送单个SQL 查询而不是许多SQL 查询。此外,SaveChanges 将在 single transaction 下运行。这意味着所有数据将被保存或不保存。也就是说,你不能有一些用户被保存而一些用户没有被保存的场景。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-28
      • 1970-01-01
      相关资源
      最近更新 更多