C# 在实体框架4.1(POCO)中添加具有预定义PK值的记录

C# 在实体框架4.1(POCO)中添加具有预定义PK值的记录,c#,asp.net,entity-framework,entity-framework-4.1,C#,Asp.net,Entity Framework,Entity Framework 4.1,我需要用与最初创建的数据库完全相同的值重新创建数据库。所以我需要添加带有预定义PK值的记录。在本例中,PK是数据库中的标识,当我试图定义它的值时,它被忽略,从标识中获取它的值。没有引发错误,但忽略了我提供的PK值 例如: Category category = new Category() { CategoryID=1, Category

我需要用与最初创建的数据库完全相同的值重新创建数据库。所以我需要添加带有预定义PK值的记录。在本例中,PK是数据库中的标识,当我试图定义它的值时,它被忽略,从标识中获取它的值。没有引发错误,但忽略了我提供的PK值

例如:

Category category = new Category()
                        {
                            CategoryID=1,
                            CategoryName="Beverages",
                            Description="Soft drinks, coffees, teas, beers, and ales"                              
                        };
ctx.Categories.Add(category);
ctx.SaveChanges();
注:

  • 我使用的是POCO,代码优先,因此,我没有EDMX模型可供配置
  • 我不想使用
    ctx.Database.ExecuteSqlCommand()
    。我希望保持一种与数据库无关的方法
在这种情况下,PK是Identity

在这种情况下,绝不应手动插入其值。一旦将列设置为identity DB,则DB应负责控制Id。因此,无法从EF传递值(除非您想中断其他功能)。您必须使用
ExecuteSqlCommand
并创建复杂的SQL,它将:

  • 启用表的标识插入
  • 插入记录
  • 关闭表的标识插入
SET identity\u INSERT tableName ON

在这种情况下,PK是Identity

在这种情况下,绝不应手动插入其值。一旦将列设置为identity DB,则DB应负责控制Id。因此,无法从EF传递值(除非您想中断其他功能)。您必须使用
ExecuteSqlCommand
并创建复杂的SQL,它将:

  • 启用表的标识插入
  • 插入记录
  • 关闭表的标识插入

SET identity\u INSERT tableName ON

必须允许在标识列中插入值,我不知道您的场景是否允许这样做,但如果您定义如下的复合键:

modelBuilder.Entity<Category>().HasKey(s => new { s.CategoryID, s.Name });
并且一定要指明它是OnModelCreating中的PK字段

modelBuilder.Entity<Category>().HasKey(c => c.PK)
modelBuilder.Entity().HasKey(c=>c.PK)

我不知道您的场景是否允许您这样做,但如果您定义一个复合键,如下所示:

modelBuilder.Entity<Category>().HasKey(s => new { s.CategoryID, s.Name });
并且一定要指明它是OnModelCreating中的PK字段

modelBuilder.Entity<Category>().HasKey(c => c.PK)
modelBuilder.Entity().HasKey(c=>c.PK)

为什么要用代码进行数据迁移?您正在编写数据迁移应用程序吗?如果您只是引入了一组数据,那么为什么不直接用SQL编写脚本呢。我怀疑你不能以数据库无关的方式来做这件事,因为不同的RDBMS将使用不同的身份插入方式。请看此帮助@Ben Robinson,让我们改变问题:我需要用完全相同的值重新创建数据库。@Ben Robinson,我使用EF 4.1 POCO(代码优先),我不能在SSDL中使用StoreGeneratedPattern,正如你在链接中建议的,因为我没有!为什么要用代码进行数据迁移?您正在编写数据迁移应用程序吗?如果您只是引入了一组数据,那么为什么不直接用SQL编写脚本呢。我怀疑你不能以数据库无关的方式来做这件事,因为不同的RDBMS将使用不同的身份插入方式。请看此帮助@Ben Robinson,让我们改变问题:我需要用完全相同的值重新创建数据库。@Ben Robinson,我使用EF 4.1 POCO(代码优先),我不能在SSDL中使用StoreGeneratedPattern,正如你在链接中建议的,因为我没有!实际上,我需要使用与最初创建的值完全相同的值重新创建数据库。但是我不知道底层数据库(所以我需要一种不可知的数据库方法)。如果你不知道底层数据库,你无论如何也不能使用EF。备份/恢复(可以用TSQL编写脚本)而不是创建一些自定义解决方案怎么样?我使用的是存储库模式。数据库实现(EF+Sql Server、NHibernate+Sql Server等)在配置文件中定义,并且使用接口IRepository访问所有数据库方法。这就是我所说的“我不知道下属数据库”的意思。实际上,我需要用与最初创建的数据库完全相同的值重新创建数据库。但是我不知道底层数据库(所以我需要一种不可知的数据库方法)。如果你不知道底层数据库,你无论如何也不能使用EF。备份/恢复(可以用TSQL编写脚本)而不是创建一些自定义解决方案怎么样?我使用的是存储库模式。数据库实现(EF+Sql Server、NHibernate+Sql Server等)在配置文件中定义,并且使用接口IRepository访问所有数据库方法。这就是我所说的“我不知道下属数据库”。