Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 创建泛型方法以对集合执行数据库字段更新并作为事务运行_C#_Generics - Fatal编程技术网

C# 创建泛型方法以对集合执行数据库字段更新并作为事务运行

C# 创建泛型方法以对集合执行数据库字段更新并作为事务运行,c#,generics,C#,Generics,我有一个像这样的模型 public class Movie { public int ID { get; set; } public string Title { get; set; } public DateTime ReleaseDate { get; set; } public boolean isDeleted { get; set; } } 我还有一个像这样的通用更新方法 public

我有一个像这样的模型

    public class Movie 
    {
        public int ID { get; set; }
        public string Title { get; set; }
        public DateTime ReleaseDate { get; set; }
        public boolean isDeleted { get; set; }
    }
我还有一个像这样的通用更新方法

    public async Task<T> UpdateAsync(T entity)
    {
        DbContext.Entry.CurrentValues.SetValues(entity);
        await DbContext.SaveChangesAsync();
        return ;
    }

     IEnumerable<Movie>
公共异步任务UpdateAsync(T实体)
{
DbContext.Entry.CurrentValues.SetValues(实体);
等待DbContext.saveChangesSync();
返回;
}
数不清
我希望能够将上面的IEnumerable传递给UpdateAsync方法。 IEnumerable有时可以有一条记录或多条记录

我的目标是从这个模型(isDeleted)更新表中的一个字段 i、 e对于集合中具有特定ID的每一行,将isDeleted字段更新为1

我如何修改上面的UpdateAsync方法来执行此操作,并在事务中执行此操作。
如果其中一个失败或出现错误,请回滚所有内容。

您可以执行以下操作:

public async Task<T> UpdateAsync(IEnumerable<T> entities, Action<T> updateFunc)
{
    foreach (var entity in entities)
    {
        updateFunc(entity);
    }

    DbContext.Entry.CurrentValues.SetValues(entities);
    await DbContext.SaveChangesAsync();
}
await UpdateAsync(movieList, movie => movie.IsDeleted = true);
从本质上讲,这可能会实现您所期望的。您向其传递应更新的实体列表,此外,还提供一个
操作
,然后根据需要转换条目

但是,在这种情况下,您可能需要重新考虑如何使用更新函数

如果您只想传递所有实体,您可能需要引入一种方法来选择具有特定ID的实体(您提到了只更新具有特定ID的实体)。另一方面,如果您只传递符合条件的实体,这表明您已经提前进行了某种筛选,因此您可以考虑重新设计代码,甚至在更新函数之外进行更新,让更新函数只执行一些简单的数据库更新

从本质上说,无论何时,只要你想拥有一个通用功能,但仍然想做一些定制的事情,
Func
Action
都是你的朋友,因为它们允许你从外部“注入”功能,而不限制你的实现


希望我答对了您的问题。

“IEnumerable有时可以有一条记录或多条记录”;听起来你需要一个循环。我知道我需要一个循环,但是我怎样才能从模型中只更新一个字段(isDeleted)?什么是updateFunc?这是我必须写的东西吗?本质上这是一个动作,在这种情况下,函数返回void并接受T作为参数。在我的示例中,我为它编写了一个简写lambda(请参见示例UpdateAsync调用的第二个参数)