2016-10-11 20 views
0

私は関連するエンティティ(多くの関係1)でエンティティを追加または更新するための一般的なメソッドを実装しようとするので、多くの時間を費やすが、私はこだわっています...エンティティフレームワーク6:一般的な方法AddOrUpdate

方法必要があります2つのパラメータを受け取り、最初は親、2番目は子です。目標は

は、ジェネリックメソッドのシグネチャがあります(存在しない場合、追加または更新)親に子実体を保存することです:このメソッドは静的クラスのサービス " とIに位置しています

public static bool AddOrUpdate<T,U>(T ItemToSave,U ItemRelated, int ID) where T : class where U : class 
    { 
     using (var context = new dbContext()) 
     {     
      var parent = context.Set<T>().Find(ID); 
      if (parent == null) return; 
      // how to retrieve now the child (ItemRelated) from the parent (ItemToSave) in order to add into it or update ? 

      return context.SaveChanges() > 0; 
     } 
    } 

任意のクラスからService.AddOrUpdate(Order _order、OrderLine _orderline、_order.OrderId)を呼び出せます。

親から子を取得して追加または更新することができません。

これを達成するために誰も助けてくれますか?

+0

あなたは何を正確に試しましたか? "??"明らかに動作しません –

+0

申し訳ありません私の質問を完了 –

+0

彼らは2つのエンティティセット、ItemToSaveは0以上のItemRelatedを持つことができます –

答えて

0

ItemRrelatedは、parentIdプロパティを持つInterfaceを実装する必要があります。 それがまだ存在しない場合は、DbSetに追加することができます。

var existingItemRelated == context.Set<U>().SingleOrDefault(ir => ir.ParentId == ItemRelated.ParentId && (/*your criteria to determine if child item equals the one in DB*/)); 

それが存在しない場合は、追加または存在する場合は編集します。あなたが親項目を持つエンティティのための共通のインタフェースを持ってしたくない場合は、子供のエンティティが同じ親

public static bool AddOrUpdate<T, U>(T ItemToSave, U ItemRelated, int ID, Expression<Func<U,bool>> sameParentsExpression) where T : class where U : class 
{ 
    using (var context = new dbContext()) 
    { 
     var parent = context.Set<T>().Find(ID); 
     if (parent == null) return false; 
     // how to retrieve now the child (ItemRelated) from the parent (ItemToSave) in order to add into it or update ? 
     var existingItemRelated = context.Set<U>() 
            .Where(sameParentsExpression) 
            .SingleOrDefault(/*your criteria to determine if child item equals the one in DB*/); 

     return context.SaveChanges() > 0; 
    } 
} 

を持っている場合

EDIT

はまた、あなたが決定し、このメソッドに式を渡すことができますし、そのように呼び出す

AddOrUpdate(order, orderline, order.OrderId, ol => ol.OrderId == order.OrderId) 
+0

"ir.ParentId"は、私たちは親の主キーについてはわからないので動作しませんジェネリック(Tはどんなクラスでもかまいません) –

+0

Tは、それが子の親Idに関係しないどんなクラスでもあります。と私は言ったようにUのクラスは、ParentIdプロパティといくつかのインターフェイスを実装する必要があります。言い換えれば、Uを "where U:IChildWithParentId"と限定してください。 –

+0

Konstantin Ershov私は私の質問でそれについてもっと説明をしました。 –

0

与えられた制約条件では、それはできません。あなたが与えた唯一の制約は、それぞれがクラスでなければならないということです。これは、その関係がどのように定義されるのかというだけでなく、親子関係があることを保証するものでもありません。

ジェネリックは魔法ではありません。彼らはあらかじめ定義された方法でアイテムを扱うことができます。そして、一般的な方法を書く前に、相互作用の定義は、でなければなりません。

関連する問題