c# - 无法在 Entity Framework 中使用 AddRange 自动生成 IDENTITY

标签 c# entity-framework orm entity-framework-6 commit

我不知道这是 Entity Framework 的设计选择还是代表我的错误方法,但每当我尝试将 AddRange 实体添加到 DbSet 时,我似乎无法获得自动生成的 IDENTITY 字段。

[Table("entities")]
public class Entity 
{
    [Key]
    [Column("id")]
    public long Id { get; set; }

    [Column("field")]
    public string Field { get; set; }
}

var entities = new Entity[] 
{
    new Entity() { Field = "A" },
    new Entity() { Field = "B" },
};

_dbContext.Entities.AddRange(entities);
await _dbContext.SaveChangesAsync();

//ids are still default(long) at this point!!

编辑: 这是显示导致问题的原因的更新代码:可枚举。无需为实体类添加其他属性。

public class Request
{
    public string Field { get; set; }

    public Entity ToEntity()
    {
        return new Entity() { Field = Field };
    }
}

public async Task<IEnumerable<long>> SaveRequests(IEnumerable<Request> requests)
{
    var entities = requests.Select(r => r.ToEntity()); //not working
    var entities = requests.Select(r => r.ToEntity()).ToArray(); //working

    _dbContext.Entities.AddRange(entities);
    await _dbContext.SaveChangesAsync();

    return entities.Select(e => e.Id);
}

最佳答案

是什么导致了这个问题?可枚举!查看我的问题中的编辑部分以获取解决方案。

编辑: 在此处发布更新的代码作为答案。问题在于我使用枚举的方式。底线是,当您需要立即获得一致的结果时,永远不要相信延迟加载。

public class Request
{
    public string Field { get; set; }

    public Entity ToEntity()
    {
        return new Entity() { Field = Field };
    }
}

public async Task<IEnumerable<long>> SaveRequests(IEnumerable<Request> requests)
{
    var entities = requests.Select(r => r.ToEntity()); //not working
    var entities = requests.Select(r => r.ToEntity()).ToArray(); //working

    _dbContext.Entities.AddRange(entities);
    await _dbContext.SaveChangesAsync();

    return entities.Select(e => e.Id);
}

关于c# - 无法在 Entity Framework 中使用 AddRange 自动生成 IDENTITY,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42480952/

相关文章:

c# - 从 IList<object_type> 获取 IList<field_type>

c# - 通过存储过程传递参数

c# - 如何获取 IQueryable<T> 结果中的上一条记录和下一条记录?

c# - Linq:按计算结果过滤并重用该结果

chalice GORM : how to access id of super class

c# - 获取列表框Windows Phone 7的选定值

C#:为什么忽略此代码?

mysql - 使用 Entity Framework 6 和 MySql 的 DbUpdateConcurrencyException

django - GORM 的 FirstOrCreate() 方法(或 Django 的 get_or_create)如何确保只创建一行?

java - 如何更新ebean orm中的所有引用