エンティティフレームワーク3への挿入例外の場合は正しい方法とロールバック
-
20-12-2019 - |
質問
私は非常に単純な質問をしています、そして私はそれを正確に正確にする方法に頭を叩いています。 エンティティフレームワークを使用し、今すぐリポジトリパターンを試行しています 私は3つのテーブルを持っています:
Story id PRIMARY KEY IDENTITY
Album id PRIMARY KEY IDENTITY
Photo id PRIMARY KEY IDENTITY
.
このような新しい物語を挿入したい:
_db.Repository.Insert(oneStory);
Save(); // Save will save it to table story
oneStory.id; // return id of last added row.
.
最近追加された物語のIDを使用して、このようなアルバムを保存したい
oneAlbum.fk_storyid=oneStory.id
_db.Repository.Insert(oneAlbum);
Save(); // Save will save it to table album
oneAlbum.id; // return id of last added row.
.
その後最近追加されたアルバムのIDを使用してくださいこの
のような写真を保存したいonePhoto.fk_albumid=oneAlbum.id
_db.Repository.Insert(onePhoto);
Save(); // Save will save it to table photo
onePhoto.id; // return id of last added row.
.
これは問題です
- アルバムまたは写真例外の保存時に何が発生した場合、物語はすでに追加されています。また、アルバムが追加されています。
- - BIGの質問Save()なしで最近追加された行のIDを取得することができ、insertを使用してください。 このようにして、私はすべての挿入を行うことができ、IDの取得を続けてから、作業単位のように最後に保存します。
だから、ここで私をここに案内することができますか。 Thankyou。
解決
Entity Framework DbContext
自体は、ののの両方です。
その上に追加のリポジトリを構築したい場合は、すべての操作が同じDbContext
を使用するように、DbContext
をそれらに注入する必要があります。
その場合、ナビゲーションプロパティを使用して、外部キーの代わりにオブジェクトをリンクする必要があります。キー値がまだありません。EFは自動的に適切な順序で物事を挿入し、外部キーに値を割り当てます。
それがオプションではない場合は、SaveChanges
を使用して1つのトランザクションですべてを折り返すことができます。
using(var tx = new TransactionScope())
{
_db.Repository.Insert(oneStory);
Save(); // Save will save it to table story
oneStory.id; // return id of last added row.
_db.Repository.Insert(oneStory);
Save(); // Save will save it to table story
oneStory.id; // return id of last added row.
onePhoto.fk_albumid=oneAlbum.id
_db.Repository.Insert(onePhoto);
Save(); // Save will save it to table photo
onePhoto.id; // return id of last added row.
tx.Complete();
}
. 所属していません StackOverflow