gpt4 book ai didi

.net-4.0 - EF : How do I rollback an update-database migration, 种子失败时?

转载 作者:行者123 更新时间:2023-12-04 22:11:02 25 4
gpt4 key购买 nike

我们有我们的迁移,我们有一个在每次迁移运行后执行的种子方法。

如果种子方法失败,我可以回滚种子数据,但我也想在代码中回滚“更新数据库”语句以将数据库结构恢复到之前的状态。

这可能吗?

部分代码:

internal sealed class Configuration : DbMigrationsConfiguration<TheContext>
{
protected override void Seed(TheContext context)
{
//Set a bunch of entities

using (var transaction = new TransactionScope())
{
try
{
context.SaveChanges();
transaction.Complete();
}
catch (Exception ex)
{
//TODO: How do I rollback the last Update-Database command?
throw;
}
}
}

最佳答案

对于像您这样的案例,如果您有影响迁移成功的数据,我的建议是在迁移内部进行。

我一直这样做,创建要在迁移的 Up 方法和 down 方法中运行的 sql 脚本。这样,当迁移成功应用时,您就知道它也与数据一致。另外,您可以撤消迁移,同时撤消所有数据。

这种方法的缺点是您不能使用 EF 的上下文来创建数据,这迫使您创建运行您手工编写的语句的 Sql 方法。

public class TestMigration() : DbMigration
{
protected override Up()
{
//Do some migration stuff

Sql("INSERT YOUR DATA HERE");
}

protected override Down()
{
//Undo some migration stuff
Sql("DELETE YOUR DATA HERE");
}
}

如果您仍然想使用 Seed 方法 aprroach,我自己没有尝试过,但我认为这可行:

internal sealed class Configuration : DbMigrationsConfiguration<TheContext>
{
protected override void Seed(TheContext context)
{
//Set a bunch of entities

using (var transaction = new TransactionScope())
{
try
{
context.SaveChanges();
transaction.Complete();
}
catch (Exception ex)
{
var migrator = new DbMigrator(this);

var lastMigration = migrator.GetDatabaseMigrations().Last();

migrator.Update(lastMigration);
}
}
}

我在这段代码中看到的问题是,在运行 Update 方法后,Seed 方法将再次触发,从而形成无限循环。

关于.net-4.0 - EF : How do I rollback an update-database migration, 种子失败时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14466956/

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