我不知道它是否是代表我的实体框架的选择或错误的方法,但每当我尝试将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);
}
答案 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,
或者您可以在MSSQL IDE中检查数据属性,如:
其次,设置&#39; ID&#39;列 StoreGeneratedPattern 为标识,您可以通过在Visual Studio中打开edmx文件,右键单击表中的数据列并选择“属性”和“StoreGeneratedPattern”来完成此操作。设置位于“属性”窗口中:
一些相关文章请参阅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中,我通过做两件事使它起作用:
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
装饰符,例如Yashveer Singh的回答执行了这两个步骤之后,我不需要将IEnums转换为Arrays。我只是能够运行:
_dbContext.Entities.AddRange(entities);
await _dbContext.SaveChangesAsync();