EFCore.BulkExtensions-使用pimarykey的BulkUpdate

时间:2020-05-06 17:49:27

标签: c# entity-framework-core efcore.bulkextensions

我们正在尝试基于主键BulkUpdate(EFCore.BulkExtensions)一个表。我们只需要基于Name而不是Id

更新Age

模型

public class Student 
{
    public int Id { get; set; } // Primary Key
    public string Name { get; set; }
    public int Age { get; set; }
}

这是我用来尝试使用主键ID更新学生姓名的代码

List<Student> students = new List<Student>();
students.Add(new Student()
{
    Id = 1,
    Name = "Name 1",
    Age = 25
});

var updateByProperties = new List<string> { nameof(Student.Id) };
var propToExclude = new List<string> { nameof(Student.Id) };
var bulkConfig = new BulkConfig { UpdateByProperties = updateByProperties, PropertiesToExclude = propToExclude };
_dbContext().BulkUpdate(students, bulkConfig);

我的期望是它将更新Name为1的行的列Id,但出现以下错误

The given key 'Id' was not present in the dictionary.

那么我如何基于主键BulkUpdate(EFCore.BulkExtensions)一个表。

1 个答案:

答案 0 :(得分:1)

让我们假设Id主键(PK),您只需要基于Name而不是Id更新Age

需要在PropertiesToInclude中设置BulkConfig属性。注意:您不必同时使用PropertiesToIncludePropertiesToExclude。 (如果要包含一半以上的属性,最好使用PropertiesToExclude,但是在您的情况下,您只想更改Name,因此我们将使用Include属性。)

此外,不需要定义UpdateByProperties,因为您想通过Id(即PK)更新数据。 UpdateByProperties定义用作更新查询的属性。

所以代码应该像这样:

List<Student> students = new List<Student>();
students.Add(new Student()
{
    Id = 1,
    Name = "Name 1",
    Age = 25
});

var propToInclude = new List<string> { nameof(Student.Name) };
var bulkConfig = new BulkConfig { PropertiesToInclude = propToInclude };
_dbContext().BulkUpdate(students, bulkConfig);