【问题标题】:Adding entities using AddRange method does not refresh entity ID使用 AddRange 方法添加实体不会刷新实体 ID
【发布时间】: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 中的错误还是它应该如何工作。我知道IEnumerablelazyListArrayeager,但是如果AddRange 方法将IEnumerable 作为参数,那么无论如何它都应该工作。

【问题讨论】:

  • 这不是 EF Core 故障。在 “不工作” 的情况下,您只是 foreach-ing new Test 对象。
  • 感谢您救了我的命!你找到解决办法了吗?我目前正在使用 ef core 2.0 并且这个问题仍然存在,至少使用您的解决方案我可以检索 id。 @LP13
  • 同上!这真的很有帮助。在 EF Core 2.1 中仍然可以看到这一点,但 .ToArray() 有效。想知道为什么会这样。

标签: entity-framework entity-framework-core


【解决方案1】:

正如 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;
    }
}

【讨论】:

    猜你喜欢
    • 2012-08-30
    • 1970-01-01
    • 1970-01-01
    • 2020-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-10
    • 1970-01-01
    相关资源
    最近更新 更多