我花了那么多时间尝试实现一个通用方法来添加或更新一个具有相关实体(关系为1到多)的实体,但是我被困在了.
该方法必须接收两个参数,第一个参数是父参数,第二个参数是子参数。目标是将子实体保存到父实体中(添加如果不存在或更新)
有一个通用方法签名:
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‘中,我希望能够从任何类调用Service.AddOrUpdate(Order _order,OrderLine _orderline,_order.OrderId)。
我被困在从父母那里检索孩子,并添加或更新到它。
有人能帮我做到这一点吗?
发布于 2016-10-11 14:19:30
您的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)发布于 2016-10-11 14:53:13
在给定的约束条件下,这是不可能的。仔细考虑一下--你给出的唯一约束就是每个类都必须是一个类。这并不保证存在父、子关系,更不用说如何定义这种关系了。
仿制药不是魔法。它们只允许您以预定义的方式处理项目。在编写泛型方法之前,交互的定义必须存在。
https://stackoverflow.com/questions/39978181
复制相似问题