C# 对实体框架的静态方法感到困惑
我正在从我的控制器调用以下命令:C# 对实体框架的静态方法感到困惑,c#,entity-framework,C#,Entity Framework,我正在从我的控制器调用以下命令: public ViewResult Index() { var users = SecurityHelpers.GetAllStaff(); return View(users); } 我调用的获取所有用户的方法如下所示: public class SecurityHelpers { private static Context db = new Context(); public static IQueryable<A
public ViewResult Index()
{
var users = SecurityHelpers.GetAllStaff();
return View(users);
}
我调用的获取所有用户的方法如下所示:
public class SecurityHelpers
{
private static Context db = new Context();
public static IQueryable<ApplicationUser> GetAllStaff()
{
var users = db.Users
.OrderBy(x => x.FirstName).ThenBy(x => x.LastName);
return users;
}
}
公共类安全帮助程序
{
私有静态上下文db=newcontext();
公共静态IQueryable GetAllStaff()
{
var users=db.users
.OrderBy(x=>x.FirstName).ThenBy(x=>x.LastName);
返回用户;
}
}
我的问题是,当我修改工作人员时,例如通过设置禁用的布尔值,方法是带回他们的旧数据(因此禁用的用户仍然处于启用状态)。我认为这是因为静态函数被缓存,直到应用程序池被回收
有没有一种方法可以从这个方法中获取最新的数据而不使其成为非静态的?(因为每次都有很多代码需要更改以稳定对象,我认为这不是正确的体系结构)
我认为这是因为静态函数被缓存,直到应用程序池被回收
不是。问题是您使用了一个长期存在的上下文(db
),它在静态变量中永远保持活动状态,并且该上下文正在缓存您正在查询的所有实体
有一种方法可以刷新缓存的实体,这样您就不会得到过时的值,但这里真正的问题是,您真的不应该保持这样一个长期存在的上下文。它会带来过时数据的问题,随着缓存的增长,您也会开始注意到性能不佳
注意(我的)重点是什么:
从数据库返回结果时,上下文中不存在的对象将附加到上下文如果对象已在上下文中,则返回现有对象
一个可行的选择是根据需要创建上下文。例如:
public class SecurityHelpers
{
public static IList<ApplicationUser> GetAllStaff()
{
using(var db = new Context())
{
var users = db.Users
.OrderBy(x => x.FirstName).ThenBy(x => x.LastName)
.ToList();
return users;
}
}
}
公共类安全帮助程序
{
公共静态IList GetAllStaff()
{
使用(var db=new Context())
{
var users=db.users
.OrderBy(x=>x.FirstName).ThenBy(x=>x.LastName)
.ToList();
返回用户;
}
}
}
根据应用程序的体系结构,您可以对其进行设置,使每个请求都有一个上下文实例。在我看来,这会更好。不管你决定怎么做,都不要使用单例上下文
我认为这是因为静态函数被缓存,直到应用程序池被回收
不是。问题是您使用了一个长期存在的上下文(db
),它在静态变量中永远保持活动状态,并且该上下文正在缓存您正在查询的所有实体
有一种方法可以刷新缓存的实体,这样您就不会得到过时的值,但这里真正的问题是,您真的不应该保持这样一个长期存在的上下文。它会带来过时数据的问题,随着缓存的增长,您也会开始注意到性能不佳
注意(我的)重点是什么:
从数据库返回结果时,上下文中不存在的对象将附加到上下文如果对象已在上下文中,则返回现有对象
一个可行的选择是根据需要创建上下文。例如:
public class SecurityHelpers
{
public static IList<ApplicationUser> GetAllStaff()
{
using(var db = new Context())
{
var users = db.Users
.OrderBy(x => x.FirstName).ThenBy(x => x.LastName)
.ToList();
return users;
}
}
}
公共类安全帮助程序
{
公共静态IList GetAllStaff()
{
使用(var db=new Context())
{
var users=db.users
.OrderBy(x=>x.FirstName).ThenBy(x=>x.LastName)
.ToList();
返回用户;
}
}
}
根据应用程序的体系结构,您可以对其进行设置,使每个请求都有一个上下文实例。在我看来,这会更好。不管你决定怎么做,都不要使用单例上下文 静态实体框架对象也可能导致数据丢失。它可能允许程序删除FK来源的记录,即使您在DB中设置了删除规则-无操作 这就是为什么必须使用此代码(用户sstan):
静态实体框架对象也可能导致数据丢失。它可能允许程序删除FK来源的记录,即使您在DB中设置了删除规则-无操作 这就是为什么必须使用此代码(用户sstan):