C# EF代码第一个InsertOrUpdate,返回T

C# EF代码第一个InsertOrUpdate,返回T,c#,entity-framework,C#,Entity Framework,我目前有一个代码,可以插入或更新并返回受影响的实体 但目前它正在返回一种特定类型 public delegate void BeforeTransaction(tbl_purchases_record x); public static tbl_purchases_record insertupdate( tbl_purchases_record param, DB context, Func<tbl_purchases_record,b

我目前有一个代码,可以插入或更新并返回受影响的实体 但目前它正在返回一种特定类型

public delegate void BeforeTransaction(tbl_purchases_record x);

public static tbl_purchases_record insertupdate(
        tbl_purchases_record param,
        DB context, 
        Func<tbl_purchases_record,bool> lambda,
        BeforeTransaction beforetransaction = null)
 {

        var entity = context.tbl_purchases_record.SingleOrDefault(lambda);

        beforetransaction?.Invoke(entity); // callable parameter

        if (entity == null)
        {
            entity = context.tbl_purchases_record.Add(param);
        } 
        else
        {
            context.Entry(entity).CurrentValues.SetValues(param);
        }

        context.SaveChanges();
        return entity;
    }
交易前公共委托无效(待定采购记录x);
公共静态tbl_采购记录插入更新(
tbl_采购记录参数,
数据库上下文,
Func lambda,
BeforeTransaction BeforeTransaction=null)
{
var entity=context.tbl\u purchases\u record.SingleOrDefault(lambda);
beforetransaction?.Invoke(实体);//可调用参数
if(实体==null)
{
实体=context.tbl\u purchases\u record.Add(参数);
} 
其他的
{
context.Entry(entity).CurrentValues.SetValues(param);
}
SaveChanges();
返回实体;
}
是否可以使此返回为动态类型? (还想问一下……这是否是一种不好的做法?

根据您的评论:


是的,我能做到。。但我的问题是context.tbl\u购买\u record.SingleOrDefault(lambda)…我尝试context.Set(typeof(TEntity))但它没有SingleOrDefault

使用泛型方法时,要使用的正确语法为:

context.Set<TEntity>().FirstOrDefault();
它也会做同样的事情。如果它发现一个预先存在的项目,它将更新它。否则将创建一个新项目但是,这不会返回创建/更新的项目,因此可能不是您希望在此处使用的项目。

根据您的评论:


是的,我能做到。。但我的问题是context.tbl\u购买\u record.SingleOrDefault(lambda)…我尝试context.Set(typeof(TEntity))但它没有SingleOrDefault

使用泛型方法时,要使用的正确语法为:

context.Set<TEntity>().FirstOrDefault();

它也会做同样的事情。如果它发现一个预先存在的项目,它将更新它。否则将创建一个新项目但是,这不会返回创建/更新的项目,因此可能不是您希望在此处使用的项目。

我会尽可能避免使用动态。为什么不让这个方法通用呢<代码>TEntity InsertOrUpdate是的,我能做到。。但我的问题是context.tbl\u购买\u record.SingleOrDefault(lambda)…我尝试context.Set(typeof(TEntity)),但这没有尽可能避免使用SingleOrDefault动态。为什么不让这个方法通用呢<代码>TEntity InsertOrUpdate是的,我能做到。。但我的问题是context.tbl\u businesss\u record.SingleOrDefault(lambda)…我尝试context.Set(typeof(TEntity)),但这没有SingleOrDefault EF AddOrUpdate将返回受影响的行?我还希望在执行插入或update@Arianne:
AddOrUpdate
不返回对象,所以我要在我的回答中加上这个警告。@Arianne:我跳过了交易前的
,因为(1)它不是实际问题/答案的一部分,(2)我没有足够的信息来理解它。当然,当在代码库中实现代码时,您可以将其添加回。对于在事务处理之前出现的
,我感到非常抱歉。但是您的回答实际上帮助了我谢谢:)…EF AddOrUpdate是否会返回受影响的行?我还想在执行insert或insert之前执行一些操作update@Arianne:
AddOrUpdate
不返回对象,因此我将在回答中添加该警告。@Arianne:我跳过了交易前的
,因为(1)这不是实际问题/答案的一部分,(2)我没有足够的信息来理解它。当然,当在代码库中实现代码时,您可以将其添加回。对于在事务处理之前出现的
,我感到非常抱歉。但你的回答实际上帮助了我谢谢:)。。
context.Set<T>().AddOrUpdate(
                     lambda,       //How to identify a pre-existing item
                     obj           //The item with new values
                );