我正在使用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
作为参数,则无论如何都应该有效。
答案 0 :(得分:1)
Ivan指出您看不到ID的原因是,在非工作情况下,您正在枚举新的测试对象。</ p>
如果在枚举中放置一个断点,您将看到在每个断点期间都会创建一个新的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;
}
}