实体框架迁移:将数据库版本作为字符串获取

use*_*153 8 c# asp.net-mvc entity-framework

我正在使用EF5开发一个Web应用程序.我想在管理页面上显示数据库版本(即迁移的名称)......这样,如果站点部署到我没有数据库管理员权限的环境,我仍然可以登录如果我需要生成升级脚本,后端找到版本.是否有我可以用来获取此信息的DBContext属性?

Yul*_*dra 13

实体框架将创建迁移历史表以管理数据库版本.

迁移历史记录表是Code First Migrations用于存储有关应用于数据库的迁移的详细信息的表.默认情况下,数据库中表的名称为__MigrationHistory,并在应用第一次迁移时创建数据库.资源

您可以使用MigrationId列作为数据库版本.列的值看起来像201408011306353_InitialCreate.只需按前15个字符的下降顺序获取最后一行.

using (var context = new AppContext())
{
    var query = "select top 1 MigrationId from __MigrationHistory order by LEFT(MigrationId, 15) desc";
    var migrationId = context.Database.SqlQuery<string>(query).FirstOrDefault();
}
Run Code Online (Sandbox Code Playgroud)


Chr*_*jen 10

实体框架核心提供:

context.Database.GetMigrations()

获取已配置的迁移程序集中定义的所有迁移.

context.Database.GetAppliedMigrations()

获取已应用于目标数据库的所有迁移.

请参阅https://docs.microsoft.com/en-us/dotnet/api/microsoft.entityframeworkcore.infrastructure.databasefacade?view=efcore-2.0

// _context = instance of MyDbContext from ctor

var lastAppliedMigration = _context.Database.GetAppliedMigrations().LastOrDefault();
var lastDefinedMigration = _context.Database.GetMigrations().LastOrDefault();
Console.WriteLine($"Last applied migration id: {lastAppliedMigration}");

Console.WriteLine(lastAppliedMigration == lastDefinedMigration
    ? "Database is up to date."
    : $"There are outstanding migrations. Last defined migration is: {lastDefinedMigration}");
Run Code Online (Sandbox Code Playgroud)

  • @PavelNazarov-是的,这就是为什么答案以“实体框架核心”开头的原因。这样,使用ef的“最新版本”的google人士(像我这样写我之前的人)就可以找到“当前”答案。最初的问题是从2014年开始的,所以我认为对于入门者来说并不太令人困惑。 (3认同)