目前,这是我如何处理我的MVC 3应用程序中的数据。对于MVC 3和实体框架都很新颖我不太确定这是在应用程序中处理数据的最佳方法。实际上,检查下面UserExists的调用有时会给出一个SQLConnectionTimeout问题,它似乎完全是随机的。我试图通过SQL分析器来追踪问题,并且看起来超时是在EF - > SQL进行连接之后发生的。MVC 3/EF/SQL处理连接,处理和超时
我以为我在另一个问题上解决了这个问题,但它又弹出来了,所以我希望得到每个人的意见,看下面是否是在我的应用程序中尝试数据处理的最佳方式,还是有更好的方法可以解决超时问题的方式。
下面是其他文章的链接,如果有帮助:MVC 3/EF/SQL Server strange connection timeout issue
所以总结一下我的问题(S):
- 代码是否低于可接受的?
- 它应该可以正常工作吗?
- 有没有更好的方法?
- 将不必要的连接到SQL保持从EF打开吗? (即使在使用语句退出后,SQL Profiler使它看起来仍然保持打开状态)
- 关于我在其他文章中发布的超时问题的任何想法?
注意:存储库实现IDisposable并具有下面列出的dispose方法。它在存储库构造函数中创建实体上下文的新实例。
控制器(登录使用自定义成员资格提供):
if (MembershipService.ValidateUser(model.UserName, model.Password))
{
User newUser = new User();
using (AccountRepository repo = new AccountRepository())
{
newUser = repo.GetUser(model.UserName);
...
}
}
会员提供的ValidateUser:
public override bool ValidateUser(string username, string password)
{
using (AccountRepository repo = new AccountRepository())
{
try
{
if (string.IsNullOrEmpty(password.Trim()) || string.IsNullOrEmpty(username.Trim()))
return false;
string hash = FormsAuthentication.HashPasswordForStoringInConfigFile(password.Trim(), "md5");
bool exists = false;
exists = repo.UserExists(username, hash);
return exists;
}catch{
return false;
}
}
}
帐户存储库方法的getUser & UserExists:
获得用户:
public User GetUser(string userName)
{
try
{
return entities.Users.SingleOrDefault(user => user.UserName == userName);
}
catch (Exception Ex)
{
throw new Exception("An error occurred: " + Ex.Message);
}
}
用户存在:
public bool UserExists(string userName, string userPassword)
{
if (userName == "" || userPassword == "")
throw new ArgumentException(InvalidUsernamePassword);
try
{
bool exists = (entities.Users.SingleOrDefault(u => u.UserName == userName && u.Password == userPassword) != null);
return exists;
}
catch (Exception Ex)
{
throw new Exception("An error occurred: " + Ex.Message);
}
}
库片段(构造,配置等):
public class AccountRepository : IDisposable
{
private DbContext entities;
public AccountRepository()
{
entities = new DbContext();
}
...
public void Dispose()
{
entities.Dispose();
}
}
谢谢大家 - 我知道这问题暴击超过9000与巨型沃尔玛你文字!
你在哪里开始和dispoe分贝范围内? – MikeSW 2012-02-15 14:36:17
抱歉,刚刚使用该信息编辑了帖子 - 我在AccountRepository构造函数中实例化实体上下文,并将其置于Dispose()方法中。 – S9Designs 2012-02-15 14:38:40