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

标签 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作为参数,无论如何它都应该工作。

最佳答案

正如 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/

相关文章:

c# - 如何仅比较 LINQ to Entities 中 TimeSpan 的分钟部分?

c# - 带有 Automapper 的 EF Core 抛出异常 'Entity type cannot be tracked'

database - 不同 Entity Framework 模型的相同连接字符串?

c# - Entity Framework 和延迟加载的问题

entity-framework - DotNetCore Entity Framework |通用分页

c# - EF Core 的 DefaultIfEmpty 异常 "bug or limitation"

c# - 通过 navigation 属性动态 Where 过滤

entity-framework - EntityFramework Core 自动迁移

c# - EF 核心实体数据访问中的强制转换无效

entity-framework - Entity Framework - 派生实体的关联