gpt4 book ai didi

c# - 现有数据库的 Entity Framework 代码优先迁移策略

转载 作者:可可西里 更新时间:2023-11-01 07:55:24 28 4
gpt4 key购买 nike

我有以下情况,无法确定正确的迁移策略。感谢帮助。

  • 应用程序创建并使用数据库作为数据存储
  • 应用程序需要在启动时更新数据库如果需要
  • 使用 Nuget 管理器控制台 不是一种选择。 (出于迁移目的,本地没问题)
  • 我在分发中有现有的非 EF 数据库

现在我想开始使用 EF 代码优先方法。我需要实现的是:

  1. 如果没有数据库则创建一个
  2. 如果数据库存在,使用空迁移(只是为下一次升级做好准备)
  3. 这应该在应用程序启动时发生

数据库不存在 ====> 创建 EF Initial =====> Upg v1 =====> Upg V2

数据库存在 =====> 跳过初始但为下一次升级做好准备 =====> Upg v1 ======> Upg v2

谢谢你的帮助

附加信息:这是存在的数据库(只是一个例子):

CREATE DATABASE Test
GO

Use Test
GO
CREATE SCHEMA [TestSchema] AUTHORIZATION [dbo]
GO
CREATE TABLE [TestSchema].[Table1](
[Id] [uniqueidentifier] NOT NULL,
[Column1] [nvarchar](500) NOT NULL,
[Column2] [bit] NOT NULL,
[Column3] [bit] NOT NULL,
CONSTRAINT [PK_MonitorGroups] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

使用逆向工程 EF 创建初始迁移:

public partial class Initial : DbMigration
{
public override void Up()
{
CreateTable(
"TestSchema.Table1",
c => new
{
Id = c.Guid(nullable: false),
Column1 = c.String(nullable: false, maxLength: 500),
Column2 = c.Boolean(nullable: false),
Column3 = c.Boolean(nullable: false),
})
.PrimaryKey(t => t.Id);
}

public override void Down()
{
DropTable("TestSchema.Table1");
}
}

如果我对不存在的数据库使用@spender 提供的代码,一切都很好。如果我将它用于现有数据库,它会一直工作,直到我更改模型(下一次迁移)。

我看到的是迁移返回的升级脚本包含整个数据库创建。并且不能针对已经存在的对象执行。

实际可行的是将迁移表添加到现有数据库并添加初始数据,但我不确定这是一个好的解决方案。

最佳答案

我花了相当长的时间才弄明白,所以很高兴在这里分享。

因此,首先您需要对数据库进行逆向工程。 Entity framework power tools可以为你做这件事。安装完成后,在您的项目中,使用 nuget 安装 EF,右键单击解决方案资源管理器中的项目节点,然后选择 Entity Framework -> Reverse Engineer Code First。这将为您的项目生成一大堆模型类和映射类。

接下来,在包管理器控制台

Enable-Migrations

然后

Add-Migration Initial

创建描述从空数据库到当前模式的转换的迁移。

现在编辑生成的 Configuration.cs 类构造函数:

    public Configuration()
{

AutomaticMigrationsEnabled = false;
AutomaticMigrationDataLossAllowed = false;
}

接下来,在应用程序启动时(如果您从网络服务器运行,可能在 global.asax Application_Start 中),您需要触发迁移。此方法将完成这项工作:

    public static void ApplyDatabaseMigrations()
{
//Configuration is the class created by Enable-Migrations
DbMigrationsConfiguration dbMgConfig = new Configuration()
{
//DbContext subclass generated by EF power tools
ContextType = typeof(MyDbContext)
};
using (var databaseContext = new MyDbContext())
{
try
{
var database = databaseContext.Database;
var migrationConfiguration = dbMgConfig;
migrationConfiguration.TargetDatabase =
new DbConnectionInfo(database.Connection.ConnectionString,
"System.Data.SqlClient");
var migrator = new DbMigrator(migrationConfiguration);
migrator.Update();
}
catch (AutomaticDataLossException adle)
{
dbMgConfig.AutomaticMigrationDataLossAllowed = true;
var mg = new DbMigrator(dbMgConfig);
var scriptor = new MigratorScriptingDecorator(mg);
string script = scriptor.ScriptUpdate(null, null);
throw new Exception(adle.Message + " : " + script);
}
}
}

现在您可以像往常一样添加更多迁移。当应用程序运行时,如果这些迁移尚未应用,它们将在调用 ApplyDatabaseMigrations 时应用。

现在您正处于 EF 代码优先折叠中。我想这就是你问的,对吧?

关于c# - 现有数据库的 Entity Framework 代码优先迁移策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25957822/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com