我使用ASP.NET MVC 4和SQL Server 2008开发了一个Web应用程序,我创建了ContextManager类,以便在所有页面中仅有一个数据库上下文。
public static class ContextManager
{
public static HotelContext Current
{
get
{
var key = "Hotel_" + HttpContext.Current.GetHashCode().ToString("x")
+ Thread.CurrentContext.ContextID.ToString();
var context = HttpContext.Current.Items[key] as HotelContext;
if (context == null)
{
context = new HotelContext();
HttpContext.Current.Items[key] = context;
}
return context;
}
}
}
大部分页面都可以正常运行,但在注册页面中出现了问题,我的上下文随后被销毁,显示以下错误:
无法完成操作,因为DbContext已被释放。
public ActionResult Register ( RegisterModel model )
{
if ( ModelState.IsValid )
{
// Attempt to register the user
try
{
WebSecurity.CreateUserAndAccount( model.UserName, model.Password,
new
{
Email = model.Email,
IsActive = true,
Contact_Id = Contact.Unknown.Id
} );
//Add Contact for this User.
var contact = new Contact { Firstname = model.FirstName, LastName = model.Lastname };
_db.Contacts.Add( contact );
var user = _db.Users.First( u => u.Username == model.UserName );
user.Contact = contact;
_db.SaveChanges();
WebSecurity.Login( model.UserName, model.Password );
在_db.Contacts.Add(contact);
这一行代码处,我遇到了异常。
但是,通过更改代码,不使用ContextManager:
HotelContext _db = ContextManager.Current;
into:
HotelContext _db = new HotelContext();
问题已经解决。但我需要使用自己的上下文管理器。问题出在哪里?