我正在使用Entity Framework(数据库优先),我正在尝试将旧数据库中的一堆数据导入到我们的新数据库中。在某些情况下,对象ID在新数据库中保持与旧数据库相同是很重要的。通常,当您创建新对象并调用context.SaveChanges()时,它将自动为ID列分配标识值。
目前,我将在代码中设置新的对象ID,但是一旦我调用了context.SaveChanges(),它就会被实体框架分配的新对象覆盖。
我需要能够手动设置新对象中的ID,并在调用context.SaveChanges()时将其保留。
答案 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();
}