2016-04-13 15 views
1

初期データ。コードファースト、AutofacEF。オートファック。常時エラーが発生しましたDBContextが破棄されました

Linq2Sql以前は、データレイヤー全体がメインプロジェクトに含まれていました。 EF CodeFirstですべてを書き直しました。 は今、私はエラーを取得しておいてください。DBContextは

が配置されているクラスがあります:

public class DataManager: IDataManager  
{ 
    private IModelDataContextWrapper _dataContext; 

    public IAuditRepository Audits { get; set; } 
    public ICDMRepository CDMs { get; set; } 
    public ICommandRepository Commands { get; set; } 
    public IMonitoringRepository Monitorings { get; set; } 
    public IRoleRepository Roles { get; set; } 
    public ISettingRepository Settings { get; set; } 
    public IUserRepository Users { get; set; } 

    public DataManager(IModelDataContextWrapper dataContext)  
    {  
     _dataContext = dataContext;  
    } 

    public IModelDataContextWrapper DataContext  
    {  
     get  
     {  
      return _dataContext;  
     }  
    } 

    public void Dispose()  
    {  
     if (_dataContext != null)  
     {  
      _dataContext.Dispose();  
      _dataContext = null;  
     } 
     GC.SuppressFinalize(this);  
    } 

    public void SaveChanges()  
    {  
     try  
     {  
      DataContext.SaveChanges();  
     }  
     catch (Exception ex)  
     {  
      string err = string.Format("exception: {0} stacktrace: {1}", ex.Message, ex.StackTrace); 

      Logger.Instance.WriteLine(err);  
     }  
    }  
} 

public class UserRepository : IUserRepository  
{  
    private readonly IModelDataContext _context; 

    public UserRepository(IModelDataContext context)  
    {  
     _context = context;  
    } 
} 

Autofac登録:

var builder = new ContainerBuilder(); 
builder.RegisterControllers(Assembly.GetExecutingAssembly()); 

builder.RegisterType<ModelDataContext>().As<IModelDataContext>().InstancePerLifetimeScope(); 
builder.RegisterType<ModelDataContextWrapper>().As<IModelDataContextWrapper>().InstancePerLifetimeScope(); 
builder.RegisterType<ArchiveModelDataContext>().As<IArchiveModelDataContext>().InstancePerLifetimeScope(); 

builder.RegisterType<DataManager>().As<IDataManager>().PropertiesAutowired().InstancePerLifetimeScope(); 

builder.RegisterType<AuditRepository>().As<IAuditRepository>().InstancePerLifetimeScope(); 
builder.RegisterType<CommandRepository>().As<ICommandRepository>().InstancePerLifetimeScope(); 
builder.RegisterType<CDMRepository>().As<ICDMRepository>().InstancePerLifetimeScope(); 
builder.RegisterType<MonitoringRepository>().As<IMonitoringRepository>().InstancePerLifetimeScope(); 
builder.RegisterType<RoleRepository>().As<IRoleRepository>().InstancePerLifetimeScope(); 
builder.RegisterType<SettingRepository>().As<ISettingRepository>().InstancePerLifetimeScope(); 
builder.RegisterType<UserRepository>().As<IUserRepository>().InstancePerLifetimeScope(); 
builder.RegisterType<ThemedViewEngine>(); 

builder.RegisterFilterProvider(); 

IContainer container = builder.Build(); 

DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); 
var lifetimeScope = DependencyResolver.Current.GetService<ILifetimeScope>(); 

lifetimeScope.InjectProperties(Membership.Provider); 

lifetimeScope.InjectProperties(Roles.Provider); 

間違っている何が?

答えて

0

個人的に私は.InstancePerRequest();を使用します。ウェブのコンテキストで。 そして、あなたはあなたがあなたのコントローラでToListメソッド()または要求トリガを持っているし、あなたのビューで

が更新されていないことを確認し、閲覧あなたの中のIQueryableを避ける必要があります。

 builder.RegisterType<ModelDataContextWrapper>() 
      .As<IModelDataContextWrapper >() 
      .InstancePerRequest(); 
+0

を最初に、それはそうだったが、それはしません()。InstancePerHttpRequest(); ()。 –

+0

InstancePerRequestでInstancePerHttp Requestではなく、静的リソースのインスタンスを避けるため、DbContextではなく、[GitHub](https://github.com/Nono31/Pixel)の使用例を見ることができます。サンプル) – Arnaud

+0

InstancePerRequestはメソッドのリストにあります。 InstancePerLifetimeScopeのみ。プロジェクトはMVC 4です。 –

関連する問題