【问题标题】:Apply Code-First migration when the project starts在项目启动时应用 Code-First 迁移
【发布时间】:2014-07-15 11:41:13
【问题描述】:

我想在项目启动时执行自动迁移。

代码和说明: 创建到数据库的连接字符串,并映射数据库。

static class Program
{
    static void Main()
    {
        var connectStr = new SqlConnectionFactory()
            .CreateConnection(new SqlConnectionStringBuilder
            {
                DataSource = "NAME-DATABASE",
                InitialCatalog = "TestDB",
                IntegratedSecurity = true,
                ApplicationName = "TestDB"
            }.ToString());
        var SessionDB = new ContentDb(connectStr);
    }
}

数据库表“TestDB”的描述,以及映射表。

public class File
{
    public int Id { get; set; }
    public string Name { get; set; }
}
public class FileMap : EntityTypeConfiguration<File>
{
    public FileMap()
    {
        ToTable("FILE");
        HasKey(x => x.Id);
        Property(x => x.Name).HasColumnName("NAME");
    }
}

主类域。

public class ContentDb : DbContext
{
    public ContentDb(DbConnection connection): base(connection, true)
    {
        Database.SetInitializer(new ContentInitializer());
        Database.Initialize(true);
    }   
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Configurations.Add(new FileMap());
        base.OnModelCreating(modelBuilder);
    }
}

类初始化和迁移

public class ContentInitializer : IDatabaseInitializer<ContentDb>
{
    public void InitializeDatabase(ContentDb context)
    {   
        if (!context.Database.Exists() || !context.Database.CompatibleWithModel(false))
        {
            var mConfig = new DbMigrationsConfiguration();
            mConfig.TargetDatabase = new DbConnectionInfo(context.Database.Connection.ConnectionString);
            var migrator = new DbMigrator(mConfig);
            var migrations = migrator.GetPendingMigrations();
            if (migrations.Any())
            {
                var scriptor = new MigratorScriptingDecorator(migrator);
                string script = scriptor.ScriptUpdate(null, migrations.Last());
                if (!String.IsNullOrEmpty(script))
                {
                    context.Database.ExecuteSqlCommand(script);
                }
            } 
        }
    }
}

【问题讨论】:

    标签: c# entity-framework-5 entity-framework-migrations


    【解决方案1】:

    你可以使用内置的MigrateDatabaseToLatestVersion初始化器

    Database.SetInitializer<ContentDb>(new MigrateDatabaseToLatestVersion<ContentDb, 
                                               Project.Migrations.Configuration>());
    using (var dB = new ContentDb(connectStr))
    {
        dB.Database.Initialize(true);
    }
    

    如果您将其添加到您的项目启动中(例如,Application_Start() in Global.asax.cs for ASP.NET)迁移将立即应用。

    如果您尚未启用迁移,您可以在包管理器控制台中执行以下操作:

    Enable-Migrations –EnableAutomaticMigrations

    注意: 自动迁移有些限制,我建议使用“编码迁移”。参见例如HERE 了解详情。

    【讨论】:

      猜你喜欢
      • 2015-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-28
      相关资源
      最近更新 更多