asp.net-mvc-3 - 由于 DbContext 已被释放,操作无法完成

标签 asp.net-mvc-3 entity-framework-4.1 ninject httpmodule

我尝试使用错误模块(Application_Error)、HttpModuleMagic.MVC3、Ninject.MVC3、EF 4.1 进行自定义错误处理(http://perspectivespace.com/100497697)。不幸的是,当我想将错误记录到数据库中时,它给出了以下错误消息: “操作无法完成,因为 DbContext 已被释放。”

有人可以帮我吗?

public class ErrorHandlerHttpModule : IHttpModule
{
    private const string ErrorControllerRouteName = "Error";
    private IErrorRepository errorRepo;
    private IUserRepository userRepo;

  //  private IUserRepository UserRepository;

    public ErrorHandlerHttpModule(IErrorRepository er, IUserRepository ur)
    {
        errorRepo = er;
        userRepo = ur;
    }

    public void Dispose()
    {
    }

    public void Init(HttpApplication context)
    {
        context.Error += Application_Error;
    }

    private void Application_Error(object sender, EventArgs e)
    {
        // Get the last error.

        var exception = HttpContext.Current.Server.GetLastError();
    ...

    error.User = userRepo.GetUserByName(name);

    ...

在 NinjectWebCommon.cs 中:

    private static void RegisterServices(IKernel kernel)
    {
        kernel.Bind<IErrorRepository>().To<ErrorRepository>().InRequestScope();
        kernel.Bind<IUserRepository>().To<UserRepository>().InRequestScope();

        kernel.Bind<IDatabaseFactory>().To<DatabaseFactory>().InRequestScope();

        kernel.Bind<IDisposable>().To<Disposable>().InRequestScope();
        kernel.Bind<IHttpModule>().To<ErrorHandlerHttpModule>();
    } 

...和 ​​UserRepository 类:

public class UserRepository : RepositoryBase<User>, IUserRepository
{
    public UserRepository(IDatabaseFactory databaseFactory)
    : base(databaseFactory)
    {
    } 

    public User GetUserByName(string name)
    {
        User us = null;
        try
        {
            us = dataContext.Users.Where(u => u.UserName.Equals(name)).FirstOrDefault() as User;
        }
        catch (Exception ex)
        {

        }
        return us;
    }
}

存储库库:

public abstract class RepositoryBase<T> where T : class
{
    protected TestContext dataContext;
    private readonly IDbSet<T> dbset;
    protected RepositoryBase(IDatabaseFactory databaseFactory)
    {
        DatabaseFactory = databaseFactory;
        dbset = DataContext.Set<T>();
    }

    protected IDatabaseFactory DatabaseFactory
    {
        get;
        private set;
    }

    protected TestContext DataContext
    {
        get { return dataContext ?? (dataContext = DatabaseFactory.Get()); }
    }
    ...

和DatabaseFactory类:

public class DatabaseFactory : Disposable, IDatabaseFactory
{
    private TestContext dataContext;

    public TestContext Get()
    {
        return dataContext ?? (dataContext = new TestContext());
    }

    protected override void DisposeCore()
    {
        if (dataContext != null)
            dataContext.Dispose();
    }
}

这行错误:

dataContext.Users.Where(u => u.UserName.Equals(name)).FirstOrDefault() as User;

我尝试遵循这篇文章: http://weblogs.asp.net/shijuvarghese/archive/2011/01/06/developing-web-apps-using-asp-net-mvc-3-razor-and-ef-code-first-part-1.aspx

感谢您的回答。

最佳答案

protected override void DisposeCore()
{
   if (dataContext != null)
   {
      dataContext.Dispose();
      dataContext = null;
   }
}

关于asp.net-mvc-3 - 由于 DbContext 已被释放,操作无法完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10486700/

相关文章:

c# - MVC 验证低于/高于其他值

c# - 安排每天在特定时间刷新 HttpContext.Cache 的任务

entity-framework-4.1 - 检索 T4 中的列映射信息

c# - 如何先获取 Entity Framework 代码中的自增值

wcf - WCF ClaimsAuthenticationManager 中的依赖注入(inject)

asp.net-mvc-3 - asp.net mvc ObjectDisposedException 与 ef

asp.net - 在 ActionLink 内添加 div

asp.net - Ninject 在 Web 服务中注入(inject)服务接口(interface)

wpf - 表/ View 没有定义主键

design-patterns - 如何使用 Ninject 等 IoC 实现 [GoF] 风格的抽象工厂模式