使用AddRange方法添加实体不会刷新实体ID

时间:2017-03-31 18:05:01

标签: entity-framework entity-framework-core

我正在使用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中的错误,或者这是它应该如何工作。我理解IEnumerablelazyListArrayeager,但如果AddRange方法将IEnumerable作为参数,则无论如何都应该有效。

1 个答案:

答案 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;
    }
}