首页 文章

具有ObjectContext实例的自定义DatabaseInitializer已被处理后[重复]

提问于
浏览
0

这个问题在这里已有答案:

我有autofac与上下文

builder.RegisterType<WebRepositoryContext>().WithParameter("mode", (GlobalVariables.DataBaseMode)).InstancePerLifetimeScope();

切换初始化程序

private static void InitializeDataStore()
    {
        switch (GlobalVariables.DataBaseMode)
        {
            case DataBaseMode.MsSql:
            {
                Database.SetInitializer(new MigrateDatabaseToLatestVersion<WebRepositoryContext, Repository.Migrations.Configuration>());

                var configuration = new Repository.Migrations.Configuration();
                var migrator = new DbMigrator(configuration);
                if (migrator.GetPendingMigrations().Any())
                    migrator.Update();
            }
                break;
            case DataBaseMode.Postgres:
            {
                Database.SetInitializer(new PostgresInitializer());
            }

                break;
        }
    }

初始化

public class PostgresInitializer : IDatabaseInitializer<WebRepositoryContext>
{
    public void InitializeDatabase(WebRepositoryContext context)
    {
        //create database
        var h = new PostgresHelper(context);
        h.Create();

        //seed database
        Seed(context);
    }

    protected virtual void Seed(WebRepositoryContext context)
    {

        var seed = new WebRepositorySeed(context);
       seed.Start();
    }
}

当我尝试在项目中获取数据时,如家庭控制器中的 var mainPage = DataContext.MainPage.First(); ,我得到 "The ObjectContext instance has been disposed and can no longer be used for operations that require a connection."

public class HomeController : BaseController 其中 public WebRepositoryContext DataContext { get; set; }

可能,初始化配置上下文,由autofac创建 . 怎么预防呢?

1 回答

  • 0

    它是一个非常糟糕的想法)_1114294_持续应用程序的生命周期:

    • DbContext 应该尽可能短暂 . 考虑到它缓存数据并跟踪更改 . 因此,随着时间的推移和操作在相同的环境下进行,事情会变得非常复杂

    • 使用sinlge DbContext 会引发并发问题: DbContext 不是线程安全的 . 只有它的静态方法 . 因此,如果您为所有MVC线程使用单个实例,您很快就会遇到各种麻烦

    我希望生命周期更短,但如果使用 InstancePerHttpRequest ,情况会有所改善 . 至少, DbContext 生命会更短,你将避免并发错误 .

相关问题