2017-07-31 8 views
0

既存の子を新しい親(1対1または1-nリレーション)に追加する場合は、まずコードを使用して定義するだけです親の中の子供とチリとEFのautomapが、その子供のIDです。 多対多の関係で同じことを行う方法はありますか?Entity Framework多対多リレーション上の新しい親に既存の子を追加する

Parent 
{ 
    int ChildId {get;set;} 
    aClass Child {get;set;} 
} 

アーキテクチャデータ: Entity Frameworkの、最初のコード。 backend webapi/restfull disconnected UIはParentDataをParentEntityにマッピングします。子コレクションは "countires"のようなものになります。新しいものを追加したくないのですが、多くのcountiresをParentに関連付けるだけです。 UIには複数選択ドロップダウンがありますので、国をチェック/選択解除することができます。

UIの誰かに続いて米国、英国

に関連

親も3が

+0

[これをチェック](http://www.entityframeworktutorial.net/code-first/configure-many-to-many-relationship-in-code-first.aspx) – Munzer

+0

私の答えの下のコメントに関して:あなたの質問には、多層アーキテクチャの問題を解決するのに十分な詳細が含まれていません。ジェネリックサンプルソリューション以上のものが必要な場合は、特定のケースに関する詳細を提供する必要があります。 – grek40

+0

完了しました。私はさらに情報を追加しました。 Thx –

答えて

0
using (var context = new YourContext()) 
{ 
    var mathClass= new Class { Name = "Math" }; 
    Student student1 = context.Students.FirstOrDefault(s => s.Name == "Alice"); 
    Student student2 = context.Students.FirstOrDefault(s => s.Name == "Bob"); 
    mathClass.Students.Add(student1); 
    mathClass.Students.Add(student2); 

    context.AddToClasses(mathClass); 
    context.SaveChanges(); 
} 

が、これはあなたを助けることができるかもしれ親に関連されるESPをチェックします。

+0

'AddToClasses'はEF4のように見えます...現在の質問のデフォルトとしてEF6以上を考慮する必要があります。 – grek40

+0

@ grek40あなたはコード内に のようなものを試してみましたか?context.Math.Add(mathClass) –

+0

私は何も試しませんでしたが、あなたのコードに 'context.Math.Add(mathClass)私はあなたが何を意味するのか理解していません。 – grek40

1

多対多では、オブジェクト全体ではなくIDで作業するのは簡単ではありません。

次のことを考えてみましょう:

class Parent 
{ 
    public Parent() 
    { 
     Children = new List<Child>(); 
    } 
    public int Id {get;set;} 
    public ICollection<Child> Children { get; set; } 
} 
class Child 
{ 
    public Child() 
    { 
     Parents = new List<Parent>(); 
    } 
    public int Id {get;set;} 
    public ICollection<Parent> Parents { get; set; } 
} 

既存の子がロードされていない(とプリロードになりたいと思っていない)されている場合は、あなただけの関係を確立するために、IDと子エントリを添付することができます。

:あなたは子供がすでにコンテキストでロードされ、あなたはまだそれをロードするために、データベースクエリを避けたいされているかどうかわからない場合
int existingChildId; // some value 
var childPlaceholder = new Child { Id = existingChildId }; 

db.Children.Attach(childPlaceholder); 

var newParent = new Parent(); 
newParent.Children.Add(childPlaceholder); 
db.Parents.Add(newParent); 

db.SaveChanges(); 

は、localエントリを検査します

+0

OKこれは私が必要とする方法だと思われますが、 "{"モデリングの保存または受諾に失敗しました。 "Model.Domain.DropDowns.Competitor"タイプのエンティティが同じ主キー値を持つためです。明示的に設定された主キー値が一意であることを確認します。データベース生成の主キーがデータベースとEntity Frameworkモデルで正しく構成されていることを確認します。 Entity Designerをデータベースファースト/モデルファースト構成に使用します。 –

+0

「既存の子がロードされていない場合」の注釈に注意してください。* ...それ以外の場合は、既にロードされている子エントリを使用する必要があります。 – grek40

+0

私はすでにコレクションに子を持っていて、その状態は追加されています。その状態を不変にしようとすると失敗します –

関連する問題