簡體   English   中英

EF。 AutoFac。 不斷得到錯誤DBContext已被處置

[英]EF. AutoFac. Constantly got error DBContext has been disposed

初始數據。 代碼優先,Autofac

之前是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);

怎么了?

我個人使用.InstancePerRequest(); 在網絡環境中。 您需要在視圖中避免IQueryable,確保在控制器中有ToList()或請求觸發器,而不是在視圖中

更新:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM