2017-02-27 73 views
2

我不知道它是否代表我的实体框架的设计选择或错误的方法,但每当我尝试将AddRange实体添加到DbSet时,我都无法获取自动生成的IDENTITY字段。无法在实体框架中使用AddRange自动生成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

[关键] [DatabaseGenerated(DatabaseGeneratedOption.Identity) –

+0

我HAE同样的问题, VAR威刚= referencias.Select(I => 新InternalClass() {/ *身份证AUTOGEN,*/... }); db.InternalClass.AddRange(aData); db.SaveChanges(); 但无法检索aData.FirstOrDefault()(id = 0) 上的新ID您是否发现了有关它发生的更多信息? –

回答

0

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

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; } 
} 
0

我在EF 6中使用数据库优先,并尝试了一段时间后,我找到了一个可能的解决方案。

首先,检查你的数据库中的表,确保你所定义的“ID”列作为一个自动增加的主键字段,可以在创建表时使用类似

ID int IDENTITY(1,1) PRIMARY KEY, 

声明。一些相关信息可以参见here1here2

,或者你可以检查数据属性在MSSQL IDE这样的:

an img I find in the internet

二,设置 'ID' 列的StoreGeneratedPattern身份,您可以通过打开EDMX文件做在Visual Studio中,右键单击表中的数据列并选择属性,并且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);