ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

实体框架:在所有迁移之前运行代码

2019-10-29 07:04:58  阅读:211  来源: 互联网

标签:ef-migrations database-migration c net entity-framework


我想在数据库中迁移存储过程和视图.由于我总是迁移到最新版本,因此,一种源代码控制友好的方法是在迁移过程中删除/重新创建所有过程/视图(使用这种方法,每个过程只有一个文件,而不是每个版本一个).

由于旧的过程/功能/视图可能与新的架构更改不兼容,因此我想在所有迁移之前删除,然后再进行创建.

以前我使用了自定义的FluentMigrator,但是现在我正在研究实体框架代码优先迁移.我看到我可以使用Seed在所有迁移之后始终运行代码.

有什么我可以用来在所有迁移之前始终运行代码的东西吗?

解决方法:

如果要在迁移开始之前运行一些代码,则可以指定一个自定义数据库初始化程序:

public class AwesomeEntity
{
    public int Id { get; set; }
}

public class AwesomeDbContext : DbContext
{
    static AwesomeDbContext()
    {
        Database.SetInitializer(new AwesomeDatabaseInitializer());
    }

    public IDbSet<AwesomeEntity> Entities { get; set; }
}

public class AwesomeDatabaseInitializer : MigrateDatabaseToLatestVersion<AwesomeDbContext, AwesomeMigrationsConfiguration>
{
    public override void InitializeDatabase(AwesomeDbContext context)
    {
        // TODO: Run code before migration here...

        base.InitializeDatabase(context);
    }
}

public class AwesomeMigrationsConfiguration : DbMigrationsConfiguration<AwesomeDbContext>
{
    public AwesomeMigrationsConfiguration()
    {
        AutomaticMigrationsEnabled = true;
    }

    protected override void Seed(AwesomeDbContext context)
    {
        // TODO: Seed database here...
    }
}

这会将自定义初始化程序设置为自MigrateDatabaseToLatestVersion继承的自定义AwesomeDatabaseInitializer.如果您想每次都删除并重建数据库,则应该使用DropCreateDatabaseAlways作为基类,尽管我不确定这是否可以运行迁移.

在初始化程序中,您可以覆盖InitializeDatabase方法,在此方法之前可以运行代码,然后调用base.InitializeDatabase,这将触发数据库初始化,进而触发迁移配置的AwesomeMigrationsConfiguration的Seed方法.

这是使用EF6.我不确定在早期版本的实体框架中是否存在等效项.

标签:ef-migrations,database-migration,c,net,entity-framework
来源: https://codeday.me/bug/20191029/1958298.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有