C# 禁用迁移
我正在编写一个附加到数据库的web api,该数据库是我首先使用Model创建的 作为新手,我首先混淆了模型和代码 由于这是我的第一个EF/Web应用程序,我没有意识到迁移还没有首先由模型实现,我按照过程来实现它。当它运行时,我收到一些错误,查找它们,然后才意识到我需要再次删除它 按照某人的指示,我从数据库中删除了migrations文件夹和_migrationHistory表C# 禁用迁移,c#,entity-framework,entity-framework-migrations,ef-model-first,C#,Entity Framework,Entity Framework Migrations,Ef Model First,我正在编写一个附加到数据库的web api,该数据库是我首先使用Model创建的 作为新手,我首先混淆了模型和代码 由于这是我的第一个EF/Web应用程序,我没有意识到迁移还没有首先由模型实现,我按照过程来实现它。当它运行时,我收到一些错误,查找它们,然后才意识到我需要再次删除它 按照某人的指示,我从数据库中删除了migrations文件夹和_migrationHistory表 protected void Application_Start() { // Call initializer
protected void Application_Start()
{
// Call initializer
Database.SetInitializer(new PulseDbInitializer());
new ApplicationDbContext().Database.Initialize(true); <- error here
AreaRegistration.RegisterAllAreas();
GlobalConfiguration.Configure(WebApiConfig.Register);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
但是现在每当数据库中缺少_migrationhistory表时,我就会收到以下异常
protected void Application_Start()
{
// Call initializer
Database.SetInitializer(new PulseDbInitializer());
new ApplicationDbContext().Database.Initialize(true); <- error here
AreaRegistration.RegisterAllAreas();
GlobalConfiguration.Configure(WebApiConfig.Register);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
受保护的无效应用程序\u Start()
{
//呼叫初始值设定项
SetInitializer(新的pulsedBinInitializer());
新建ApplicationDbContext().Database.Initialize(true);您的初始值设定项继承自检查模型更改的DropCreateDatabaseIfModelChanges
。由于您不首先使用代码,因此无法检查代码中的模型更改(由于您的代码不定义模型-即代码优先-…模型定义代码-即模型优先-…因此您需要实现自己的IDatabaseInitializer
,它只检查(例如)数据库是否存在:
public partial class PulseDbInitializer : IDatabaseInitializer<ApplicationDbContext>, IPulseDbInit
{
public void InitializeDatabase(ApplicationDbContext context)
{
var exists = new DatabaseTableChecker().AnyModelTableExists(context.InternalContext);
if (exists == DatabaseExistenceState.Exists)
{
// maybe check if certain data exists and call the `Seed` method if
// it doesn't
return;
}
// Throw some error if it doesn't exist
}
protected override void Seed(ApplicationDbContext context)
{
_context = context;
var pid = new PulseDbInitializionData(context);
pid.Init(this);
}
}
公共部分类pulsedBinInitializer:IDatabaseInitializer,IPulseDbInit
{
public void InitializeDatabase(ApplicationDbContext上下文)
{
var exists=新建DatabaseTableChecker().AnyModelTableExists(context.InternalContext);
if(exists==DatabaseExistenceState.exists)
{
//可能会检查某些数据是否存在,如果存在,则调用'Seed'方法
//没有
返回;
}
//如果不存在,则抛出一些错误
}
受保护的重写无效种子(ApplicationDbContext上下文)
{
_上下文=上下文;
var pid=新的PulseDbInitializionData(上下文);
pid.Init(this);
}
}
您注释掉的DropCreateDatabaseAlways应该可以工作。@SteveGreene是的,但这会在每次初始化时删除并重新创建数据库,不是吗?是的,运行一次,然后切换回DropCreateDatabaseIfModelChanges