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

时间:2015-09-09 06:16:55

标签: c# asp.net-mvc entity-framework

当我为dbcontextupdate调用需要insert的方法时 但只想要一个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();

功能: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声明静态变量?

非常感谢。

3 个答案:

答案 0 :(得分:4)

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

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

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

这是一个简单的例子:

class UserLogin
{
    private TempDBEntity dbContex;

    UserLogin()
    {
        // ctor create dbContext
    }

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

    void AddLog()
    {
        // ...
    }

    void SaveChanges()
    {
        //dbContext.SaveChanges()...
    }
}

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

答案 1 :(得分:4)

您可以按如下方式使用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);
}

功能: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(); 
}

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

答案 2 :(得分:1)

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