首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实体框架6:泛型方法AddOrUpdate

实体框架6:泛型方法AddOrUpdate
EN

Stack Overflow用户
提问于 2016-10-11 13:17:42
回答 2查看 1K关注 0票数 0

我花了那么多时间尝试实现一个通用方法来添加或更新一个具有相关实体(关系为1到多)的实体,但是我被困在了.

该方法必须接收两个参数,第一个参数是父参数,第二个参数是子参数。目标是将子实体保存到父实体中(添加如果不存在或更新)

有一个通用方法签名:

代码语言:javascript
复制
    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)。

我被困在从父母那里检索孩子,并添加或更新到它。

有人能帮我做到这一点吗?

EN

回答 2

Stack Overflow用户

发布于 2016-10-11 14:19:30

您的ItemRrelated应该使用parentId属性实现一些接口。然后,如果它还不存在,就可以将它添加到DbSet中。

代码语言:javascript
复制
var existingItemRelated == context.Set<U>().SingleOrDefault(ir => ir.ParentId == ItemRelated.ParentId && (/*your criteria to determine if child item equals the one in DB*/));

如果不存在,则添加或编辑(如果存在)。

编辑

此外,如果不希望为具有父项的实体具有公共接口,则可以将表达式传递给此方法,以确定子实体是否具有相同的父实体。

代码语言:javascript
复制
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;
    }
}

呼吁它就像

代码语言:javascript
复制
AddOrUpdate(order, orderline, order.OrderId, ol => ol.OrderId == order.OrderId)
票数 0
EN

Stack Overflow用户

发布于 2016-10-11 14:53:13

在给定的约束条件下,这是不可能的。仔细考虑一下--你给出的唯一约束就是每个类都必须是一个类。这并不保证存在父、子关系,更不用说如何定义这种关系了。

仿制药不是魔法。它们只允许您以预定义的方式处理项目。在编写泛型方法之前,交互的定义必须存在

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39978181

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档