Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework core EFCore:迁移和初始数据库创建_Entity Framework Core_Ef Code First_Entity Framework Migrations - Fatal编程技术网

Entity framework core EFCore:迁移和初始数据库创建

Entity framework core EFCore:迁移和初始数据库创建,entity-framework-core,ef-code-first,entity-framework-migrations,Entity Framework Core,Ef Code First,Entity Framework Migrations,我正在使用EFCore(最近从EF迁移来的)对代码迁移进行代码优先的DBs。每当我创建新迁移时,EFCore都会更新上下文模型快照。因此,当我使用 using (var db = new AudmDatabaseContext()) { if (!db.Database.GetService<Microsoft.EntityFrameworkCore.Storage.IRelationalDatabaseCreator>().Exists()) { d

我正在使用EFCore(最近从EF迁移来的)对代码迁移进行代码优先的DBs。每当我创建新迁移时,EFCore都会更新上下文模型快照。因此,当我使用

using (var db = new AudmDatabaseContext())
{
    if (!db.Database.GetService<Microsoft.EntityFrameworkCore.Storage.IRelationalDatabaseCreator>().Exists())
    {
        db.Database.EnsureCreated();
    }
}
使用(var db=new AudmDatabaseContext())
{
如果(!db.Database.GetService().Exists())
{
db.Database.recreated();
}
}
我有当前的数据库结构。但是,当我有一个现有系统时,我需要运行迁移

using (var db = new AudmDatabaseContext())
{
    if (db.Database.GetService<Microsoft.EntityFrameworkCore.Storage.IRelationalDatabaseCreator>().Exists())
    {
            var pendingMigrations = db.Database.GetPendingMigrations();
            if (pendingMigrations.Count() > 0)
            {
                db.Database.Migrate();
             }
         }
     }
}
使用(var db=new AudmDatabaseContext())
{
如果(db.Database.GetService().Exists())
{
var pendingMigrations=db.Database.GetPendingMigrations();
如果(pendingMigrations.Count()>0)
{
db.Database.Migrate();
}
}
}
}
现在,假设我使用DB创建代码创建了一个新的DB。然后在稍后的某个时候,我将更改DB模式,因此我需要运行迁移。但是,当我这样做时,我会将所有迁移都作为挂起,迁移器会尝试对已经进行的DB模式进行更改,这显然是不起作用的。(请注意,我的初始迁移已将所有代码注释掉,否则它将再次创建整个数据库,但已使用DB.Database.confurecreated()完成此操作。)

那么这里推荐的方法是什么?我需要能够为我的软件的新安装创建新的DBs,并且我需要能够迁移(因此我实际上设置了我的应用程序,以便在启动时自动执行迁移,以避免错过任何更改)

我想到的最明显的一点是,要有某种标志,告诉迁移器运行迁移,但实际上在执行初始创建时不执行任何sql代码,因此新创建的数据库似乎已经完全迁移到迁移器。。当我稍后有新的挂起迁移时,只会执行自创建初始数据库以来添加到代码中的这些新的挂起迁移


我只是好奇其他人在做什么,因为我似乎无法在官方文档中找到解决此问题的推荐方法。

我想到的另一种方法是使用迁移进行初始创建。。因此,在数据库不存在时设置一个标志,该标志将在初始迁移中启用所有注释掉的迁移代码。缺点是,随着迁移数量的增加,初始DB设置需要更长的时间,并且可能会做一些冗余的事情(如果添加列,以后再删除它们)。优点是,与使用前面概述的方法的每个迁移文件相比,您只需要在初始迁移上使用该标志。。当我创建数据库时,列出挂起的迁移,然后将适当的记录插入到_EFMigrationHistory表中。但是我从哪里获得ProductVersion?我想到的另一种方法是使用迁移进行初始创建。。因此,在数据库不存在时设置一个标志,该标志将在初始迁移中启用所有注释掉的迁移代码。缺点是,随着迁移数量的增加,初始DB设置需要更长的时间,并且可能会做一些冗余的事情(如果添加列,以后再删除它们)。优点是,与使用前面概述的方法的每个迁移文件相比,您只需要在初始迁移上使用该标志。。当我创建数据库时,列出挂起的迁移,然后将适当的记录插入到_EFMigrationHistory表中。但是我从哪里获得ProductVersion?