我应该在每次更改后调用 Entity Framework SaveChanges 一次还是单独调用

Should i be calling Entity Framework SaveChanges once or individually after each change

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

单击保存后,我将数据从控制器传递到名为 PartyService 的服务 class,该服务负责保存详细信息(我正在尝试使用 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 个地方可供用户创建派对和派对用户。

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

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

在您的情况下,SaveParty 创建上下文实例并使 SaveSinglePartySaveSinglePartyUser 使用该实例创建和插入实体是有意义的,并且那么只有 SaveParty 会调用 SaveChanges.

优点是单个 SaveChanges 调用将向数据库发送单个 SQL 查询而不是许多 SQL 查询。此外,SaveChanges 将在 single transaction 下 运行。这意味着将保存或不保存所有数据。也就是说,您不能出现某些用户已保存而某些用户未保存的情况。

只需要一个上下文

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