我首先在EF模型中遇到了我的模型问题。我有一个Web应用程序,带有安全层和实体层以及mvc3层。所以在每一层我都放了一个我的上下文db的实例(一个用于主声明部分中的每个类)。问题是当y找到我的数据库的任何用户来验证登录过程,简单搜索,而不是在实体中进行任何更改,就像这样:
var usr = db.Usuarios.First(user => user.UserName.Equals(userName));
如果我在其他层(在我的控制器用户中)更改密码,并且再次注销登录,则linq搜索(请参阅代码)始终返回旧密码。这是针对上下文db不配置而不去数据库的数据,简单地为模型加载用户。
那么,我如何强制模型刷新数据库中的数据呢? 我尝试,把懒惰的负载放在虚假但不起作用。
db.Configuration.LazyLoadingEnabled = false;
如果我在metod中对我的上下文的实例进行decalre以验证passwork并处理此实例,那么部分工作,但我认为这是最佳实践。
像那样: public static bool ValidateUser(string userName, string password)
{
if (!string.IsNullOrEmpty(userName) && !string.IsNullOrEmpty(password))
{
var dbtmp = new ConorContainer();
var usr = dbtmp.Usuarios.First(user => user.UserName.Equals(userName));
if (usr != null)
{
var passDescrypt = Decript(usr.Password);
dbtmp.Dispose();
return passDescrypt.Equals(password);
}
return false;
}
return false;
}
答案 0 :(得分:0)
您必须在每种情况下决定上下文的生命周期。最好在Web应用程序中使用短期上下文特别是在静态方法中。
使用using
块可以在超出范围时调用Dispose
方法来改进您的方法。
public static bool ValidateUser(string userName, string password)
{
if (!string.IsNullOrEmpty(userName) && !string.IsNullOrEmpty(password))
{
using(var dbtmp = new ConorContainer())
{
var usr = dbtmp.Usuarios.First(user => user.UserName.Equals(userName));
if (usr != null)
{
var passDescrypt = Decript(usr.Password);
return passDescrypt.Equals(password);
}
}
return false;
}
return false;
}