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

时间:2017-02-27 08:29:42

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

我不知道它是否是代表我的实体框架的选择或错误的方法,但每当我尝试将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);
}

4 个答案:

答案 0 :(得分:7)

导致问题的原因是什么?可枚举!请查看我的问题中 EDIT 部分的解决方案。

答案 1 :(得分:0)

请尝试这个,它适用于Int类型列,需要尝试长类型。

[Table("entities")]
public class Entity 
{
    [Key]
    [Column("id")]
    // this you need to tell to Ef to use Identity .
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public long Id { get; set; }

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

答案 2 :(得分:0)

我在EF 6中使用Database First,经过一段时间的尝试后,我找到了一个可能的解决方案。

首先,检查数据库中的表格,确保您已定义了“ID&#39;列作为自动增量主键字段,可以使用类似

的方式声明
ID int IDENTITY(1,1) PRIMARY KEY,

创建表格时。一些相关信息可以显示here1here2

或者您可以在MSSQL IDE中检查数据属性,如:

an img I find in the internet

其次,设置&#39; ID&#39;列 StoreGeneratedPattern 标识,您可以通过在Visual Studio中打开edmx文件,右键单击表中的数据列并选择“属性”和“StoreGeneratedPattern”来完成此操作。设置位于“属性”窗口中:

enter image description here

一些相关文章请参阅here

完成上述操作后,使用EF AddRange,ID将自动增加并且一切正常。

public class Entity 
{
    public long Id { get; set; }
    public string Field { get; set; }
}

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

_dbContext.Entities.AddRange(entities);

答案 3 :(得分:0)

在使用Code First的Entity Framework Core中,我通过做两件事使它起作用:

  1. 我在实体的主键上添加了[DatabaseGenerated(DatabaseGeneratedOption.Identity)]装饰符,例如Yashveer Singh的回答
  2. 我将新实体对象的主键设置为0

执行了这两个步骤之后,我不需要将IEnums转换为Arrays。我只是能够运行:

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