我正在编写一个附加到我使用Model First创建的数据库的web api。
成为新手我让Model First与Code First混淆。
由于它是我的第一个EF / Web应用程序,我没有意识到Model First尚未实现迁移,我按照程序实现了它。当它运行时,我收到一些错误,查看它们,然后才意识到我需要再次删除它。
根据某人的说明,我删除了迁移文件夹,并从数据库中删除了_migrationHistory表。
但是,只要数据库中缺少_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);
}
&#34;类型&#39; System.NotSupportedException&#39;的例外情况发生在EntityFramework.dll中但未在用户代码中处理 附加信息:无法检查模型兼容性,因为数据库不包含模型元数据。只能检查使用Code First或Code First Migrations创建的数据库的模型兼容性。&#34;
以下是我的初始化程序的部分描述
public partial class PulseDbInitializer : DropCreateDatabaseIfModelChanges<ApplicationDbContext>, IPulseDbInit
//public partial class PulseDbInitializer :DropCreateDatabaseAlways<ApplicationDbContext>, IPulseDbInit
{
private ApplicationDbContext _context;
protected override void Seed(ApplicationDbContext context)
{
_context = context;
var pid = new PulseDbInitializionData(context);
pid.Init(this);
}
}// class PulseDbInitializer
该应用似乎正在尝试使用迁移(因为它创建了_migrationhistory表),即使我已删除了迁移子文件夹。 作为新人,我不知道该往哪里去。我知道我已经创建了我的初始化程序,见上文,所以我错过了什么?
我不确定我们是否相互理解。
很简单,我不知道在我的数据库中生成_MigrationHistory表是什么,如果从项目中删除Migration子目录并删除数据库,那么我认为这都是我需要做的是放弃迁移。
首先在我的模型中,DropCreateDatabaseIfModelChanges是我一直用于生成数据库并且按预期工作的。它会创建一个新数据库,或在模型更改时重新创建。
在我添加迁移之前,我没有注意到这个_MigrationHistory表,如果add-migration命令在项目中添加了我需要删除或更改的任何代码,我就不知道了(我真的讨厌发生的事情,而不是被告知在某种日志中做了什么。请微软,以备将来参考)
或者我完全错了,_MigrationHistory表总是在那里,但我从未注意到?这一切似乎都有效,只要我不删除该表。
答案 0 :(得分:0)
您的初始值设定项继承自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);
}
}