gpt4 book ai didi

c# - 如何使用 Entity Framework 对象上下文执行事务?

转载 作者:行者123 更新时间:2023-11-30 13:51:02 25 4
gpt4 key购买 nike

我使用 Entity Framework 4 创建了一个非常简单的数据库。我希望能够在实体上使用事务,但我似乎无法阻止回滚更改。我真的只需要一种方法来在将实体保存到数据库之前放弃对实体的临时更改。

例如,以下代码使用 Entity Framework 对象上下文“MusicContainer”。在 TransactionScope 中,创建了一个 Artist 实体。然后事务没有完成就结束了;所以我希望交易能够回滚。但是,程序运行起来就好像我从来没有创建过 TransactionScope 一样; TransactionScope 结束后,music.SaveChanges() 行将对象保存到数据库。

class Program
{
static void Main(string[] args)
{
using (MusicContainer music = new MusicContainer())
{
using (TransactionScope transaction = new TransactionScope())
{
Artist artist = new Artist { Name = "Test" };
music.Artists.AddObject(artist);
}
// The transaction ended without Complete(); shouldn't the changes be abandoned?
music.SaveChanges();
}
}
}

如果 Entity Framework 没有按照我期望的方式使用 TransactionScope,我如何才能获得我正在寻找的功能?我有几种情况,函数的调用者传入 MusicContainer,我需要在从函数返回之前让 MusicContainer 处于干净状态(即回滚更改,这样它们就不会意外地保存在另一个 SaveChanges 中在同一个 MusicContainer 对象上)。

最佳答案

在这种情况下您根本不需要 TransactionScopeSaveChanges() 就是所需要的 - 如果您有另一个 using使用 MusicContainer block ,这将在一个单独的事务中,并且不会在您当前的 using block 中保存任何更改。 TransactionScope 只有跨越多个数据库上下文的事务才需要。

一般情况下,上下文应该只用于由相关操作组成的工作单元,一旦它们完成调用 SaveChanges()。为每个独立的、不相关的工作单元打开一个新的上下文。话虽如此,只需在您的场景中使用它:

        using (MusicContainer music = new MusicContainer())
{
Artist artist = new Artist { Name = "Test" };
music.Artists.AddObject(artist);
music.SaveChanges();
}

关于c# - 如何使用 Entity Framework 对象上下文执行事务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5222734/

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