Jay*_*van 3 c# entity-framework transactionscope
我使用Entity Framework 4创建了一个非常简单的数据库.我希望能够在实体上使用事务,但我似乎无法通过回滚来保持更改.我真的只需要在将实体保存到数据库之前放弃对实体的临时更改.
例如,以下代码使用实体框架对象上下文"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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果实体框架没有像我期望的那样使用TransactionScope,我怎样才能获得我正在寻找的功能?我有几种情况,函数的调用者在MusicContainer中传递,我需要在从函数返回之前将MusicContainer保持在干净状态(即回滚更改,以便他们不会意外地保存在另一个调用的SaveChanges中在同一个MusicContainer对象上).
TransactionScope在这种情况下你完全不需要,SaveChanges()只需要所有 - 如果你有另一个using块MusicContainer,这将是一个单独的事务,并不会保存当前using块中的任何更改.TransactionScope仅跨越多个DB上下文的事务需要.
一般而言,上下文仅应用于由相关操作组成的工作单元,一旦完成调用SaveChanges().为每个单独的,不相关的工作单元打开一个新的上下文.话虽如此,只需在你的场景中使用它:
using (MusicContainer music = new MusicContainer())
{
Artist artist = new Artist { Name = "Test" };
music.Artists.AddObject(artist);
music.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5430 次 |
| 最近记录: |