我使用实体框架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();
}
}
}
如果实体框架不使用的TransactionScope,我期待它给来这里的路上,我怎么能得到我要找的功能?我有几种情况,一个函数的调用者在MusicContainer中传入,并且在我从函数返回之前,我需要将MusicContainer保持在一个干净的状态(即回滚更改,以便它们不会意外地被另一个SaveChanges调用在同一个MusicContainer对象上)。
您是否建议我为每笔交易使用单独的“使用(MusicContainer music = new MusicContainer())”?我的第一个怀疑是,如果我有几十个并行发生的话,这将是一个瓶颈 - 我错了吗? – 2011-03-07 17:22:57
@notfed我相信开销很小 - 数据库连接仅在需要时由EF使用,即调用'SaveChanges()'或执行查询时,还可以查看此MSDN文章:http://msdn.microsoft.com/ en-us/library/cc853327.aspx – BrokenGlass 2011-03-07 17:42:44
@notfed:您必须为每个事务使用新的容器。阅读这里:http://stackoverflow.com/questions/3653009/entity-framework-and-connection-pooling/3653392#3653392 – 2011-03-07 18:00:13