2

私はEF Code First 5を使用しています。関連する提案、ドキュメント、テンプレートの3つのエンティティ/ POCOクラスがあります。提案書は、ドキュメント テーブルと M 対 M の関係にあります。テンプレートはドキュメント テーブルと M 対 M の関係にあります。

これが私のPOCO C#クラスです

public class Document {
   public int Id { get; set; }
   public string FileName { get; set; }
   public ICollection<Proposal> Proposals { get; set; }
   public ICollection<Template> Templates { get; set; }
}

public class Proposal {
    public int Id { get; set; }
    public string Title{ get; set; }
    public string Description { get; set; }
    public ICollection<Document> Documents { get; set; }
}

public class Template {
    public int Id { get; set; }
    public string Title{ get; set; }
    public string Description { get; set; }
    public ICollection<Document> Documents { get; set; }
}

私のフロントエンド MVC アプリでは、ユーザーが提案を作成し、それにドキュメントを追加します。次に、投稿されたデータを MVC アクション メソッドで受け取り、すべてのドキュメントを提案 Documents コレクションに追加します。

 proposal.Description = model.Description;
 proposal.Documents = GetDocumentsFromPostedFiles(model.Files);
 db.Entry(proposal).State = EntityState.Added;
 db.SaveChanges();

データベースに保存するときにドキュメントに一意のIDが割り当てられ、私の提案にリンクされるため、これは完全に機能します。

ただし、同じアクションの同じ画面で、ユーザーは提案に追加したドキュメントを新しいテンプレートに保存するオプションがあります。そのため、テンプレート テーブルが、1 つの MVC アクション メソッドで提案に追加されているのと同じドキュメントを参照するようにします。投稿されたデータ - 1 提案を受け取ります。- 多くのドキュメント - 新しいテンプレートのタイトル、説明なので、更新したいのは、この投稿されたデータを含む 3 つのテーブルすべてです。

私は次のことを試しました:

 proposal.Description = model.Description;
 proposal.Documents = GetDocumentsFromPostedFiles(model.Files);

 template.Description = model.TemplateDescription;
 template.Documents = proposal.Documents();

 db.Entry(proposal).State = EntityState.Added;
 db.Entry(template).State = EntityState.Added;   

 db.SaveChanges();

データベースは db.SaveChanges の後にデータベースに設定するため、新しい追加されていないドキュメントにはドキュメント ID が設定されていない (値はデフォルトで 0) ため、これは明らかに正しく更新されません。実行すると、テンプレートのドキュメント ID が誤って保存されます。 0 として。

テンプレート オブジェクトのドキュメントが追加されたばかりの提案ドキュメントに関連していることを Entity Framework に伝えるにはどうすればよいですか? 提案またはテンプレートの 1 対 M の開始点を使用して、エンティティ フレームワークにそれらをデータベースに追加するように指示しますが、私の場合のように、1 対 M の関係が 2 つあるため、2 つの M テーブルがあることを EF にどのように伝えるのですか?実際、最初のdb.SaveChangesを実行すると同じテーブルになりますか?

これに対する他の解決策はありますか?最初に提案をデータベースに保存し、データベースから作成された主キー ID を使用して追加されたばかりのすべてのドキュメントを読み取り、それらをテンプレートに追加することしか考えられません。これにより、 db.SaveChanges 、Linq db Fetch、および db.SaveChanges が再び発生し、1 つの db.SaveChanges でこれを実行したいと考えています。

4

1 に答える 1