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调用的第二个参数)