2016-10-11 136 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

由于给定的约束,它是不可能的。考虑一下 - 你给出的唯一约束是每个都必须是一个类。这并不能保证有父母的亲子关系,更不用说如何定义这种关系。

泛型并不神奇。他们只是允许你以预定义的方式处理项目。在我们编写一个通用方法之前,交互的定义就存在了。