2016-10-11 181 views
0

我花那麼多時間試圖實現一個通用的方法來添加或更新與相關實體(關係一對多)一個實體,但我堅持......實體框架6:泛型方法AddOrUpdate

方法必須接收2個參數,第一個是父母,第二個是孩子。我們的目標是子實體保存到父(添加如果它不存在或更新)

有泛型方法簽名:

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

Your ItemRrelated應該實現一些帶parentId屬性的接口。 然後你可以將它添加到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; 
    } 
} 

和呼籲它像

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

「ir.ParentId」不起作用,因爲我們不知道父母的主鍵,因爲它會通用(T可以是任何類) –

+0

T可以是任何類,它與孩子的父母身份無關。正如我所說的,U類應該實現與ParentId屬性的一些接口。換句話說,你應該將U限制爲「where U:IChildWithParentId」 –

+0

Konstantin Ershov我在你的問題中給了你更多的解釋,你能否更明確地描述你的解決方案? –

0

由於給定的約束,它是不可能的。考慮一下 - 你給出的唯一約束是每個都必須是一個類。這並不能保證有父母的親子關係,更不用說如何定義這種關係。

泛型並不神奇。他們只是允許你以預定義的方式處理項目。在我們編寫一個通用方法之前,交互的定義就存在了。