我正在使用 EF Core 1.1.1
.我在添加 IEnumerable<Entity>
时注意到了使用 AddRange
方法然后调用 SaveChanges()
然后实体将保存在数据库中,但它们的 ID 不会刷新。
下面的代码不 SaveChanges() 后刷新 ID。请注意,我将请求作为 IEnumerable
传递
public async Task Post([FromBody]IEnumerable<string> values)
{
var requests = values.Select(x => new Test()
{
Name = x,
Status = "Init"
});
await _dbContext.Tests.AddRangeAsync(requests).ConfigureAwait(false);
await _dbContext.SaveChangesAsync().ConfigureAwait(false);
foreach (var r in requests)
{
var id = r.ID;
}
}
下面的代码不 SaveChanges() 后刷新 ID。注意我正在通过
request.ToList()
作为 AddRange
的参数方法 public async Task Post([FromBody]IEnumerable<string> values)
{
var requests = values.Select(x => new Test()
{
Name = x,
Status = "Init"
});
await _dbContext.Tests.AddRangeAsync(requests.ToList()).ConfigureAwait(false);
await _dbContext.SaveChangesAsync().ConfigureAwait(false);
foreach (var r in requests)
{
var id = r.ID;
}
}
下面的代码 SaveChanges() 后刷新 ID。请注意,我正在调用
ToList()
选择值后。 public async Task Post([FromBody]IEnumerable<string> values)
{
var requests = values.Select(x => new Test()
{
Name = x,
Status = "Init"
}).ToList(); //<------ ToList() or ToArray() would work
await _dbContext.Tests.AddRangeAsync(requests).ConfigureAwait(false);
await _dbContext.SaveChangesAsync().ConfigureAwait(false);
foreach (var r in requests)
{
var id = r.ID;
}
}
我不确定这是 EF 中的错误还是它应该如何工作。我明白
IEnumerable
是 lazy
和 List
和 Array
是 eager
,但如果 AddRange
方法正在服用IEnumerable
作为参数,无论如何它都应该工作。
最佳答案
正如 Ivan 所说,您没有看到 id 的原因是在非工作情况下您正在枚举新的测试对象。
如果在可枚举中放置一个断点,您将看到在 for each 期间它会在那时创建新的 Test 对象。这些不是放在数据库中的相同对象。
你实际上是在枚举 IEnumerable 两次
public async Task Post([FromBody]IEnumerable<string> values)
{
var requests = values.Select(x => {
//place break point here
new Test()
{
Name = x,
Status = "Init"
}
});
await _dbContext.Tests.AddRangeAsync(requests.ToList()).ConfigureAwait (false);
await _dbContext.SaveChangesAsync().ConfigureAwait(false);
foreach (var r in requests)
{
var id = r.ID;
}
}
关于entity-framework - 使用 AddRange 方法添加实体不会刷新实体 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43147035/