【发布时间】:2017-03-31 18:05:01
【问题描述】:
我正在使用EF Core 1.1.1。我注意到当我使用AddRange 方法添加IEnumerable<Entity> 然后调用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 作为参数,那么无论如何它都应该工作。
【问题讨论】:
-
这不是 EF Core 故障。在 “不工作” 的情况下,您只是
foreach-ing newTest对象。 -
感谢您救了我的命!你找到解决办法了吗?我目前正在使用 ef core 2.0 并且这个问题仍然存在,至少使用您的解决方案我可以检索 id。 @LP13
-
同上!这真的很有帮助。在 EF Core 2.1 中仍然可以看到这一点,但 .ToArray() 有效。想知道为什么会这样。
标签: entity-framework entity-framework-core