私はEntity Framework 4を使用して非常に単純なデータベースを作成しました。エンティティでトランザクションを使用できるようにしたいのですが、変更をロールバックしないように見えません。エンティティがデータベースに保存される前に一時的な変更を放棄する方法が必要です。Entity Frameworkオブジェクトコンテキストでトランザクションを実行する方法は?
たとえば、次のコードでは、エンティティフレームワークオブジェクトコンテキスト "MusicContainer"を使用しています。 TransactionScope内で、アーティストエンティティが作成されます。トランザクションは完了せずに終了します。私はトランザクションがロールバックされることを期待しています。しかし、プログラムは、あたかも最初にTransactionScopeを作成したことがないかのように動作します。 TransactionScopeの終了後、music.SaveChanges()行はオブジェクトをデータベースに保存します。エンティティフレームワークは、TransactionScopeの私はここにそれを期待してい方法を使用していない場合は
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();
}
}
}
、どのように私は私が探している機能を得ることができますか?関数の呼び出し元がMusicContainerを渡すいくつかの状況があります。関数から戻る前にMusicContainerをクリーンな状態にしておく必要があります(つまり、別のSaveChangesで誤って保存されないように変更をロールバックします同じMusicContainerオブジェクトにある)。
私は、各取引で別々の "using(MusicContainer music = new MusicContainer())"を使用することをお勧めしますか?私が最初に疑ったのは、このようなことが並行して数十件あると、これがボトルネックになるということでした。私はそれを考えるのが間違っていますか? –
@notfed DB接続は、必要に応じて、つまり 'SaveChanges()'を呼び出すときやクエリを実行するときにだけ使用されます。このMSDNの記事もチェックしてください:http://msdn.microsoft.com/ ja-us/library/cc853327.aspx – BrokenGlass
@notfed:トランザクションごとに新しいコンテナを使用する必要があります。ここをクリックしてください:http://stackoverflow.com/questions/3653009/entity-framework-and-connection-pooling/3653392#3653392 –