2015-07-20 66 views
0

我可能不理解迁移,但我正在更新我的开源应用程序以使用它们。我的目标是实体框架迁移 - 自动创建表和更新

1)当用户首次使用空白数据库运行应用程序时,应用程序自动创建表(并命中我的种子方法以自动填充所需的数据)。

2)如果我添加任何新的属性到我的实体/模型类,它们是在数据库时自动添加的。

是否可以在不使用Nuget命令的情况下执行此操作?正如我希望这会带走很多我的安装程序代码,用于初次创建表并在第一次安装时添加数据。

我有以下设置

Database.SetInitializer(new MigrateDatabaseToLatestVersion<MVCForumContext, Migrations.Configuration>(AppConstants.MvcForumContext)); 

我的配置类

internal sealed class Configuration : DbMigrationsConfiguration<MVCForumContext> 
{ 
    public Configuration() 
    { 
     AutomaticMigrationsEnabled = true; 
     AutomaticMigrationDataLossAllowed = false; 
    } 

    protected override void Seed(MVCForumContext context) 
    { 
     // This method will be called after migrating to the latest version. 

     // You can use the DbSet<T>.AddOrUpdate() helper extension method 
     // to avoid creating duplicate seed data. E.g. 
     // 
     // context.People.AddOrUpdate(
     //  p => p.FullName, 
     //  new Person { FullName = "Andrew Peters" }, 
     //  new Person { FullName = "Brice Lambson" }, 
     //  new Person { FullName = "Rowan Miller" } 
     // ); 

     //TODO - ADD THE INITIAL DATA HERE 
    } 
} 

我有我所有的模型类映射到正确使用流利的API(即)

public class BadgeMapping : EntityTypeConfiguration<Badge> 
{ 
    public BadgeMapping() 
    { 
     HasKey(x => x.Id); 

     Property(x => x.Id).IsRequired(); 
     Property(x => x.Name).IsRequired().HasMaxLength(50); 
     Property(x => x.Description).IsOptional(); 
     Property(x => x.Type).IsRequired().HasMaxLength(50); 
     Property(x => x.Image).IsOptional().HasMaxLength(50); 
     Property(x => x.DisplayName).IsRequired().HasMaxLength(50); 
     Property(x => x.AwardsPoints).IsOptional(); 

     // Ignores 
     Ignore(x => x.Milestone); 
    } 
} 

再一次,我可能会误解。但是我创建了一个空白数据库并运行指向数据库的应用程序。

无法创建所有字段的表,因为我怀疑?我在这里错过了什么吗?

我一直在针对现有的数据库进行开发,为了让它工作,我找到了一篇博客文章,概述您需要做些什么才能使其与现有数据库一起工作。

只需运行在包管理器 控制台窗口附加迁移初始命令,浏览到迁移文件夹,修改已添加新的文件 ,它将包含inhereits DbMigration一类,有两个方法,向上和向下。如果删除方法的所有 内容,但保留方法,则在程序包管理器控制台中运行 Update-Database -Verbose命令,它将 工作。

所以我清除了UP()和Down()方法。如果我把它们放回去,那么我不能针对现有的数据库运行。

也许这只是我认为它会比我想象的更聪明。知道如果需要创建表并根据模型映射自动更新缺少的字段?

回答

2

每次更改模型类时都需要使用添加迁移。在将新迁移应用于您的数据库之后,当您第一次运行应用程序时。在第一次迁移时,您的数据库将获取MigrationHistory表,然后将其用于检查已应用哪些迁移以及需要应用哪些迁移。

+0

我在印象之下,你可以做到这一点没有Nuget?那么您可以通过编译的应用程序部署更改和安装? – leen3o

+0

对不起,没有。我总是使用nuget。我真的不相信没有nuget就可以做到这一点。但我没有看到一个大问题。您只需要添加“文件与迁移”,然后部署应用程序。为什么你不想使用nuget? – anastasiya

+2

@anastasiya是对的。 updatemigrationsyadayadayada初始化器运行现有的迁移。它不确定迁移可以是什么。有这样的自动迁移功能。但是,这给你零控制。它会发现,创建并执行迁移。它默认关闭,甚至在EF7中消失。我甚至不会将它用于演示应用程序。就像anastasiya说的那样,我只是使用add-migrations,并将结果类包含在已部署的应用程序中。然后初始化器会做这件事。 –