这个问题在这里已有答案:
我有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 回答
它是一个非常糟糕的想法)_1114294_持续应用程序的生命周期:
DbContext
应该尽可能短暂 . 考虑到它缓存数据并跟踪更改 . 因此,随着时间的推移和操作在相同的环境下进行,事情会变得非常复杂使用sinlge
DbContext
会引发并发问题:DbContext
不是线程安全的 . 只有它的静态方法 . 因此,如果您为所有MVC线程使用单个实例,您很快就会遇到各种麻烦我希望生命周期更短,但如果使用
InstancePerHttpRequest
,情况会有所改善 . 至少,DbContext
生命会更短,你将避免并发错误 .