我有一个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...
但是该脚本仅 会创建表。它没有提供连接数据库或查看数据库是否存在并创建数据库(如果不存在)的准备。我需要一个更聪明的脚本
那么我应该采用这个脚本迁移生成的脚本,然后将其包装在一个更大的脚本中,对我来说所有这些工作都可以吗?是否有一些命令可以完成所有这些工作?
我认为这是EF Core世界中已解决的问题。我只是在寻找最佳实践。有人可以在这里给我任何指导吗?
答案 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();