使用dbcontext的正确方法(全局或传递为参数?)

当我调用一个需要dbcontext进行updateinsert但只需要一个saveChange() ,如下所示

行动:登录

  TempDBEntity context = new TempDBEntity(); var temp = context.Users.Where(m => m.user_unique_id == 1).FirstOrDefault(); temp.timestamp = new DateTime(); temp.AddLog("Login"); context.SaveChanges(); 

function:AddLog

 public void AddLog(string activity){ TempDBEntity context2 = new TempDBEntity(); var log = new UserLog(); log.user_id = this.user_id; log.activity = activity; context2.UserLog.Add(log); context2.SaveChanges(); } 

如您所见,有两个SaveChanges() ,我只需要1个SaveChanges()

我应该将DBContext作为AddLog()另一个参数传递,还是应该在这种情况下为dbcontext声明静态变量?

非常感谢。

在你的情况下,我会在你需要的方法中创建一个新的dabtase上下文,因为这是最简单的方法,你可以非常好地重用你的方法。

这不应该产生很多性能问题,因为entity framework会缓存数据库上下文中的所有重要信息,因此创建一个新的非常快。

如果你想要优化事务量,那么我会编写一种处理程序,它实现了它自己的SaveChanges方法并为每个实例保存一个数据库上下文。 比你有一个更多的抽象层和一个很好的API供以后使用。

这是一个简单的例子:

 class UserLogin { private TempDBEntity dbContex; UserLogin() { // ctor create dbContext } void Login() { // Login... } void AddLog() { // ... } void SaveChanges() { //dbContext.SaveChanges()... } } 

在我看来,传递dbcontext作为参数不是一个很好的解决方案。 但这是基于意见的……

您可以使用dbcontext,如下所示:

行动:登录

 using(TempDBEntity context = new TempDBEntity()) { var temp = context.Users.Where(m => m.user_unique_id == 1).FirstOrDefault(); temp.timestamp = new DateTime(); temp.AddLog("Login", context); } 

function:AddLog

 public void AddLog(string activity, TempDBEntity context) { var log = new UserLog(); log.user_id = this.user_id; log.activity = activity; context.UserLog.Add(log); context.SaveChanges(); } 

这将在使用后正确处理对象。

 I think you don't need to create new context in your AddLog function, you can pass the same first context to your AddLog function and then add your UserLogs to that without calling savechanges like this- public void AddLog(TempDBEntity context, string activity){ var log = new UserLog(); log.user_id = this.user_id; log.activity = activity; context.UserLog.Add(log); }