Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么我的DbContext没有被处理,或者为什么';它不能像预期的那样工作吗_C#_.net_Asp.net Mvc_Entity Framework_Unity Container - Fatal编程技术网

C# 为什么我的DbContext没有被处理,或者为什么';它不能像预期的那样工作吗

C# 为什么我的DbContext没有被处理,或者为什么';它不能像预期的那样工作吗,c#,.net,asp.net-mvc,entity-framework,unity-container,C#,.net,Asp.net Mvc,Entity Framework,Unity Container,好吧,准备读一篇很长的文章,因为我认为这很复杂 我将实体框架与MicrosoftUnity以及存储库和工作单元的自定义实现结合使用 首先,我有一个存储库: public class Repository<TEntity> : RepositoryBase<TEntity>, IRepository<TEntity> where TEntity : class { #

好吧,准备读一篇很长的文章,因为我认为这很复杂

我将实体框架与MicrosoftUnity以及存储库和工作单元的自定义实现结合使用

首先,我有一个存储库:

public class Repository<TEntity> : RepositoryBase<TEntity>,
                                        IRepository<TEntity>
    where TEntity : class
{
    #region Constructors

    public Repository(IDbContext context, UnitOfWork unitOfWork)
        : base(context, unitOfWork)
    { }

    #endregion

    #region Properties

    private bool _disposed;

    #endregion

    #region Methods

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    protected virtual void Dispose(bool disposing)
    {
        if (!_disposed)
        {
            if (disposing)
            {
                Context.Dispose(); // Dispose the main context.
            }
        }

        _disposed = true;
    }

    #endregion

    // Extra code has been removed for clarity.
}
因此,默认情况下,它已经实现了IDisposable接口

现在,我有了Unity来解析接口的具体类型:

container.RegisterType<IDbContext, OxygenDataContext>(new PerRequestLifetimeManager());
container.RegisterType<IUnitOfWork, UnitOfWork>(new PerRequestLifetimeManager());
container.RegisterType(新的PerRequestLifetimeManager());
RegisterType(新PerRequestLifetimeManager());
在global.asax文件中,我在EndRequest中处理对象(我明确需要这段代码,因为否则似乎不会调用dispose):

受保护的无效应用程序\u EndRequest(对象发送方,事件参数e)
{
var container=DependencyResolver.Current.GetService();
container.Resolve().Dispose();
container.Resolve().Dispose();
}
但是,当我现在打开一个页面并从正在工作的数据库中检索内容时,当我使用SQL Server管理资源管理器直接更改数据库中的数据并刷新页面时,页面仍然显示旧数据,但我认为所有内容都已正确处理

谁有主意,我都快发疯了

编辑

看起来上下文正在被释放,但我使用的是VirtualFileProvider,在它们的上下文中,返回的值没有更新

此外,当应用程序启动且我按下CTRL-F5(保持按下)时,会弹出各种错误,其中一个错误是:

ExecuteReader需要打开且可用的连接。连接的当前状态为“打开”


这是实体框架中的预期行为吗?

好的,我发现了问题所在

我遇到的问题是,在MVC的VirtualFileProvider中,我通过工作单元使用存储库,而不处理它们

我已经对它们进行了修改,所以现在可以使用
使用
语句连接到数据库来检索数据。
所有的问题现在都解决了。

我可能会说这是一篇冗长而复杂的文章,因为你的解决方案既冗长又复杂。。也许在这个问题上重新思考一下你的架构?
public class UnitOfWork : Repository.UnitOfWork
{
    #region Constructors

    public UnitOfWork(IDbContext context)
        : base(context)
    {
        _pageRepository = new Repository<Page>(context, this);
    }

    #endregion

    #region Properties

    private readonly IRepository<Page> _pageRepository;

    public IRepository<Page> PageRepository { get { return _pageRepository; } }

    private bool _disposed;

    #endregion

    #region Methods

    public override void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);

        base.Dispose();
    }

    protected override void Dispose(bool disposing)
    {
        if (!_disposed)
        {
            if (disposing)
            {
                // Disposes all the repositories.
                PageRepository.Dispose();

                // Disposes the main context.
                _context.Dispose(); 
            }
        }

        _disposed = true;
    }

    #endregion
}
public class OxygenDataContext : DbContext, IDbContext
{
    #region Constructors

    public OxygenDataContext() :
        base("Ox")
    { }

    #endregion

    #region Properties

    public IDbSet<Page> Page { get; set; }

    #endregion

    #region IDbContext Members

    public IRepositoryEntityCollection<TEntity> Set<TEntity>() where TEntity : class
    { return new RepositoryEntityCollection<TEntity>(this); }

    public new void SaveChanges()
    { base.SaveChanges(); }

    #endregion
}
container.RegisterType<IDbContext, OxygenDataContext>(new PerRequestLifetimeManager());
container.RegisterType<IUnitOfWork, UnitOfWork>(new PerRequestLifetimeManager());
protected void Application_EndRequest(object sender, EventArgs e)
{
    var container = DependencyResolver.Current.GetService<IUnityContainer>();

    container.Resolve<IDbContext>().Dispose();
    container.Resolve<IUnitOfWork>().Dispose();
}