EF Core App-如何编写安装脚本?

时间:2018-10-23 18:10:22

标签: c# sql-server entity-framework-core

我有一个EF核心应用程序(使用WPF,C#),我可以作为开发人员来构建和运行。从Package Manager控制台编辑数据模型,创建迁移和更新数据库都没有问题。但是现在我试图编写一个安装程序(评估各种安装工具),并且想知道在安装时该怎么做。

我能找到的所有EF Core文档似乎纯粹是从开发人员的角度来解决数据库创建问题。但是我不能让用户在我的源代码上完全运行包管理器控制台。但是,一旦安装了我的应用程序,数据库就必须存在。我不知道如何最好地使用EF Core提供的输出在安装时创建数据库。最佳做法是什么?

例如,在我的项目中,我看到了“迁移”文件夹,这是我从PM Console运行add-migration命令时EF Core为我创建的。它具有使用“ Up”方法从“ Migration”派生的类,该方法在C#中创建表。

public partial class init : Migration
{
    protected override void Up(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.CreateTable(
            name: "AnalysisTypes",
            columns: table => new
            {
                Key = table.Column<string>(nullable: false),
                Name = table.Column<string>(nullable: true),
                Show = table.Column<bool>(nullable: false)
            },
            constraints: table =>
            {
                table.PrimaryKey("PK_AnalysisTypes", x => x.Key);
            });

        ...etc ... etc... etc...

似乎似乎是创建我的数据库的理想选择。也许我应该以某种方式将此Migration派生的类提取到单独的控制台应用程序中,以便在安装时运行以创建数据库。这是通常要做的事情吗?

或者,如果我从PM Console运行script-migration -idempotent命令,则会得到一个SQL脚本,该脚本创建所需的表。

IF OBJECT_ID(N'[__EFMigrationsHistory]') IS NULL
BEGIN
    CREATE TABLE [__EFMigrationsHistory] (
        [MigrationId] nvarchar(150) NOT NULL,
        [ProductVersion] nvarchar(32) NOT NULL,
        CONSTRAINT [PK___EFMigrationsHistory] PRIMARY KEY ([MigrationId])
    );
END;

GO

CREATE TABLE [AnalysisTypes] (
    [Key] nvarchar(450) NOT NULL,
    [Name] nvarchar(max) NULL,
    [Show] bit NOT NULL,
    CONSTRAINT [PK_AnalysisTypes] PRIMARY KEY ([Key])
);

GO

... etc ... etc... etc...

但是该脚本 会创建表。它没有提供连接数据库或查看数据库是否存在并创建数据库(如果不存在)的准备。我需要一个更聪明的脚本

  • 连接到正确的sql服务器
  • 检查数据库是否存在
  • 如果没有创建它。
  • 确保其架构是最新的。

那么我应该采用这个脚本迁移生成的脚本,然后将其包装在一个更大的脚本中,对我来说所有这些工作都可以吗?是否有一些命令可以完成所有这些工作?

我认为这是EF Core世界中已解决的问题。我只是在寻找最佳实践。有人可以在这里给我任何指导吗?

1 个答案:

答案 0 :(得分:0)

如果已经创建了数据库,则可以通过设置调用SetInitializer来将数据库初始化程序设置为迁移到最新版本。

Database.SetInitializer<ObjectContext>(new MigrateDatabaseToLatestVersion<ObjectContext, Configuration>());

发件人:https://msdn.microsoft.com/en-us/magazine/dn818489.aspx

  

如果要编译项目并将其交给其他开发人员   尚未迁移自己的开发数据库(初始化器)的人   会触发该应用寻找迁移。迁移将   找到了,因为它在项目中。初始化程序将检查   数据库的迁移历史记录表,并更新数据库架构(如果有)   

     

在生产阶段而不是开发阶段考虑迁移类   将被编译到您的程序集中,并作为   应用。当应用程序运行时,它将响应   MigrateDatabaseToLatestVersion设置(在   您的应用程序)并相应地更新数据库架构。

您可以阅读有关迁移here的更多信息。

编辑

对于EF Core: 发件人: http://flores.eken.nl/ef-core-equivalent-of-migratedatabasetolatestversion/

  

现在是重要的部分。当然,您希望您的程序运行   应用程序自动迁移(及后续迁移)   启动。在EF 6.x天内,可以使用   MigrateDatabaseToLatestVersion数据库初始化程序。

     

这在EF核心中已更改。现在,您将必须使用:

context.Database.Migrate();