gpt4 book ai didi

c# - DbContext 已被释放

转载 作者:太空狗 更新时间:2023-10-29 19:58:24 26 4
gpt4 key购买 nike

我使用 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;
}
}
}

它在大多数页面中都能正常工作,但在注册页面中出现问题,我的上下文因以下错误而被废除:

The operation cannot be completed because the DbContext has been disposed.

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;

进入:

HotelContext _db = new HotelContext();

问题解决了。但是我需要使用我自己的 ContextManager。有什么问题?

最佳答案

您的上下文已被放置在其他地方(不在您显示的代码中),所以基本上当您从 Register 操作访问它时,它会抛出异常。

实际上,您不应该使用静态单例来访问您的上下文。 为每个请求实例化一个新的 DbContext 实例。参见 c# working with Entity Framework in a multi threaded server

关于c# - DbContext 已被释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18635508/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com