C# 为什么我的DbContext没有被处理,或者为什么';它不能像预期的那样工作吗
好吧,准备读一篇很长的文章,因为我认为这很复杂 我将实体框架与MicrosoftUnity以及存储库和工作单元的自定义实现结合使用 首先,我有一个存储库: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 { #
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();
}