私はasp.net mvc、Entityframework 6とDIシナリオのUnityを使用しています。DbContextオブジェクトが破棄されました:オブジェクトを破棄しないようにするにはどうすればよいですか?
私のDbContextオブジェクトがあまりにも早く廃棄されている理由がわかりませんでした。
私はGenericWoUクラスをPeopleController
クラスに注入しました。 ListPersonアクションを呼び出すと、すべて正常に動作しますが、DbContextは破棄されます。私は、リストのすべての人を編集しようとするのであれば、次のエラーが表示されます
DbContextは 私はDbContextが配置されるように防ぐことができる方法
が配置されているため、操作を完了することができませんこれほど早く?ここで
は、ワーク・クラスの私の一般的な単位である:ここでは
public class GenericUoW : IDisposable, IGenericUoW
{
private readonly DbContext entities = null;
public Dictionary<Type, object> repositories = new Dictionary<Type, object>();
public GenericUoW(DbContext entities)
{
this.entities = entities;
}
public IRepository<T> Repository<T>() where T : class
{
if (repositories.Keys.Contains(typeof(T)) == true)
{
return repositories[typeof(T)] as IRepository<T>;
}
IRepository<T> repo = new GenericRepository<T>(entities);
repositories.Add(typeof(T), repo);
return repo;
}
public void SaveChanges()
{
entities.SaveChanges();
}
private bool disposed = false;
protected virtual void Dispose(bool disposing)
{
if (!this.disposed)
{
if (disposing)
{
entities.Dispose();
}
}
this.disposed = true;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
は私GenericRepository
クラスである:ここでは
class GenericRepository<T> : IRepository<T> where T : class
{
private readonly DbContext entities = null;
private DbSet<T> _objectSet;
public GenericRepository(DbContext _entities)
{
entities = _entities;
_objectSet = entities.Set<T>();
}
public IEnumerable<T> GetAll(Func<T, bool> predicate = null)
{
if (predicate != null)
{
return _objectSet.Where(predicate);
}
return _objectSet.AsEnumerable();
}
public T Get(Func<T, bool> predicate)
{
return _objectSet.First(predicate);
}
public void Add(T entity)
{
_objectSet.Add(entity);
}
public void Attach(T entity)
{
_objectSet.Attach(entity);
}
public void Delete(T entity)
{
_objectSet.Remove(entity);
}
}
は私のContainerBootstrapperクラスです:
public class ContainerBootstrapper
{
public static IUnityContainer Initialise()
{
var container = BuildUnityContainer();
DependencyResolver.SetResolver(new UnityDependencyResolver(container));
return container;
}
private static IUnityContainer BuildUnityContainer()
{
var container = new UnityContainer();
DbContext entities = new TeijonStuffEntities();
container.RegisterInstance(entities);
GenericUoW GUoW = new GenericUoW(entities);
container.RegisterInstance(GUoW);
MvcUnityContainer.Container = container;
return container;
}
}
あなたは 'GenericUoW'に' IDisposable'を実装するべきではありません。コンシューマークラスは依存関係(コンポジションルートとコンテナのみ)の所有権を持たず、依存関係(この場合は 'DbContext')が存在するかどうかを知らないため、注入された依存関係を処分しないでください廃棄されているかどうか。正確な原因を説明するのに十分な詳細がないので、「Dispose」機能を削除すると実際に問題が解決する可能性があります。 – Steven
関連:https://stackoverflow.com/questions/12259534/is-it-a-leaky-abstraction-if-implementation-of-interface-calls-dispose – Steven
関連:https://stackoverflow.com/a/30287923/264697 – Steven