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

时间:2016-03-05 14:17:15

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

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

当点击保存时,我将数据从控制器传递到名为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之前做所有更改)。

我从这两种方法中获得了什么好处?我要指出的是,在用户可以创建聚会和派对用户的应用程序中可能只有一个位置。

我是整个架构的新手,所以任何建议都会受到赞赏。

2 个答案:

答案 0 :(得分:1)

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

在您的情况下,SaveParty创建上下文的实例并使SaveSinglePartySaveSinglePartyUser使用该实例来创建和插入实体,然后仅SaveParty会致电SaveChanges

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

答案 1 :(得分:0)

只需要一个上下文

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

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

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