正确使用dbcontext的方法(全局还是作为参数传递?)
本文关键字:参数传递 全局 dbcontext 方法 | 更新日期: 2023-09-27 18:11:54
当我调用需要update
或insert
的dbcontext
的方法时但只需要一个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()
,我只需要一个SaveChanges()
。
我应该传递DBContext
作为AddLog()
的另一个参数吗或者在这种情况下我应该为dbcontext
声明静态变量吗?
在您的情况下,我会在您需要的方法中创建一个新的数据库上下文,因为这是最简单的方法,您可以很好地重用您的方法。
这应该不会造成很多性能问题,因为实体框架在数据库上下文中缓存所有重要信息,所以创建一个新的非常快。
如果你想优化事务的数量,我会写一种处理程序,它实现了自己的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);
}
功能: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);
}