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

cha*_*tng 9 c# asp.net-mvc entity-framework

当我打电话说需要一种方法dbcontextupdateinsert ,但只想要一个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();
Run Code Online (Sandbox Code Playgroud)

功能: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();
 }
Run Code Online (Sandbox Code Playgroud)

如你所见,有两倍SaveChanges(),我只需要1 SaveChanges().

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

非常感谢.

Ben*_*dEg 8

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

这应该不会造成很多性能问题,因为实体框架在数据库上下文中缓存了所有重要信息,因此创建一个新的非常快。

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

这是一个简单的例子:

class UserLogin
{
    private TempDBEntity dbContex;

    UserLogin()
    {
        // ctor create dbContext
    }

    void Login()
    {
        // Login...
    }

    void AddLog()
    {
        // ...
    }

    void SaveChanges()
    {
        //dbContext.SaveChanges()...
    }
}
Run Code Online (Sandbox Code Playgroud)

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


小智 5

您可以按如下方式使用 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);
}
Run Code Online (Sandbox Code Playgroud)

功能:添加日志

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(); 
}
Run Code Online (Sandbox Code Playgroud)

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

  • 很好,但我会将 `SaveChanges()` 放在主要方法级别。 (6认同)