DbContext已经处理完毕

Ali*_*ani 7 c# asp.net asp.net-mvc entity-framework dbcontext

我使用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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

由于已经处理了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 );
Run Code Online (Sandbox Code Playgroud)

在线_db.Contacts.Add( contact );我得到了例外.

但是不通过改变使用ContextManager

HotelContext _db = ContextManager.Current;
Run Code Online (Sandbox Code Playgroud)

成:

HotelContext _db = new HotelContext();
Run Code Online (Sandbox Code Playgroud)

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

ken*_*n2k 9

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

实际上,您不应该使用静态单例来访问您的上下文.为每个请求实例化一个新DbContext实例.请参阅c#在多线程服务器中使用Entity Framework


Dha*_*hni 5

就我而言,我的GetAll方法未在lambda表达式中的where子句之后调用ToList()方法。使用ToList()之后,我的问题解决了。

Where(x => x.IsActive).ToList();
Run Code Online (Sandbox Code Playgroud)