我花了很多时间尝试实现一个通用方法来添加或更新具有相关实体的实体(关系一对多)但我被卡住了......
该方法必须接收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)
您的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)
答案 1 :(得分:0)
使用给定的约束,这是不可能的。仔细想想 - 你给出的唯一限制是每个必须是一个类。这并不能保证存在父子关系,更不用说如何定义这种关系了。
泛型不是魔术。它们只是允许您以预定义的方式处理项目。在编写泛型方法之前,存在交互必须的定义。