質問

私は非常に単純な質問をしています、そして私はそれを正確に正確にする方法に頭を叩いています。 エンティティフレームワークを使用し、今すぐリポジトリパターンを試行しています 私は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();
}
.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top