无法在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中的数据属性,如:
其次,将“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; } }