实体框架 - 手动设置新对象的ID

时间:2012-03-29 21:42:40

标签: entity-framework entity-framework-4

我正在使用Entity Framework(数据库优先),我正在尝试将旧数据库中的一堆数据导入到我们的新数据库中。在某些情况下,对象ID在新数据库中保持与旧数据库相同是很重要的。通常,当您创建新对象并调用context.SaveChanges()时,它将自动为ID列分配标识值。

目前,我将在代码中设置新的对象ID,但是一旦我调用了context.SaveChanges(),它就会被实体框架分配的新对象覆盖。

我需要能够手动设置新对象中的ID,并在调用context.SaveChanges()时将其保留。

3 个答案:

答案 0 :(得分:6)

您可以将模型设计器(或EDMX文件)中的StoreGeneratedPattern设置为None实体的关键属性。对于整数键列,它是Identity是默认值,这意味着实体框架不会将键值发送到数据库,因为它期望数据库将创建键。如果模式为None,则会将值发送到您为实体提供的数据库。

(对于DbContext(EF> = 4.1),它被称为DatabaseGeneratedOption。)

当然,同时您还需要关闭数据库表中键列的Identity规范。

答案 1 :(得分:6)

数据库生成选项也可以指定为属性本身的属性,而不是使用流畅的API。

public class Foo
{
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public virtual int Id { get; set;}
}

答案 2 :(得分:0)

如果您不想为 id 生成值,您可以查看 MS 文档 here

有两种方法。

数据注释方式[DatabaseGenerated(DatabaseGeneratedOption.None)]

public class Blog
{
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int BlogId { get; set; }

    public string Url { get; set; }
}

Fluent API 方式ValueGeneratedNever

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Blog>()
        .Property(b => b.BlogId)
        .ValueGeneratedNever();
}