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

我不知道它是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> SaveRequests(IEnumerable 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); } 

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

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

首先,检查数据库中的表,确保将“ID”列定义为自动增量主键字段,可以使用类似的方式声明

 ID int IDENTITY(1,1) PRIMARY KEY, 

在创建表时。 一些相关信息可以在here1或here2中看到。

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

我在互联网上找到的img

其次,将“ID”列的StoreGeneratedPattern设置Identity ,可以通过在Visual Studio中打开edmx文件,右键单击表中的“数据列”并选择“属性”,然后在“属性”窗口中设置StoreGeneratedPattern来实现:

在此处输入图像描述

一些相关的文章见这里 。

完成上述操作后,使用EF AddRange,ID将自动增加,并且所有function都很好。

 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); 

请尝试这个,它适用于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; } }