C# 实体框架:IDENTITY_INSERT出现问题-“无法在表中插入IDENTITY列的显式值”
我将EntityFramework4.0与C.NET一起使用。我正在尝试创建一个简单的迁移工具来将数据从一个表转换到另一个表。这些表是不同的 该数据库是一个SQL Server 2005 我的目标数据库结构类似于以下内容:C# 实体框架:IDENTITY_INSERT出现问题-“无法在表中插入IDENTITY列的显式值”,c#,entity-framework-4,C#,Entity Framework 4,我将EntityFramework4.0与C.NET一起使用。我正在尝试创建一个简单的迁移工具来将数据从一个表转换到另一个表。这些表是不同的 该数据库是一个SQL Server 2005 我的目标数据库结构类似于以下内容: MYID - int, primary key, identity specification (yes) MYData - varchar(50) 在迁移程序中,我将DB结构导入edmx。然后手动关闭StoreGeneratedPattern 在我的迁移程序中,我关闭了标
MYID - int, primary key, identity specification (yes)
MYData - varchar(50)
在迁移程序中,我将DB结构导入edmx。然后手动关闭StoreGeneratedPattern
在我的迁移程序中,我关闭了标识列,如下所示。我已验证它确实关闭了标识列:
using (newDB myDB = new newDB())
{
//turn off the identity column
myDB.ExecuteStoreCommand("SET IDENTITY_INSERT SR_Info ON");
}
在上面的代码之后,我有以下代码:
using (newDB myDB = new newDB())
{
DB_Record myNewRecord = new DB_Record();
//{do a bunch of processing}
myNewRecord.MYID = 50;
myDB.AddToNewTable(myNewRecord);
myDB.SaveChanges();
}
当它到达myDB.SaveChanges时,会生成一个异常:无法在表中插入标识列的显式值
当我手动转到SQL Server表并关闭标识规范时,我知道代码工作正常
我的首选是让迁移工具处理打开和关闭标识规范,而不是在数据库上手动执行。此迁移工具将用于沙箱数据库、开发人员数据库、QA数据库,然后是完全自动化的生产数据库
有什么办法让它正常工作吗
我使用了以下步骤:
创建具有标识列的数据库表。
在Visual Studio中,添加新的EDMX。
在EDMX上,我选择“从数据库更新模型”,然后选择“添加所需的表”
在EDMX上,我单击MYID,并在属性窗格中将StoreGeneratedProcedure设置为None。
此时,当我添加一个设置了MYID的新记录时,DB会用标识值覆盖MYID的值
到目前为止,无论我在何处添加了myDB.ExecuteStoreCommandSET IDENTITY\u INSERT SR\u Info ON;,它的表现是一样的
我尝试添加一个存储过程,但它也不起作用
我怀疑最终,迁移不会完全自动化。这看起来很有希望
您基本上需要确保您的数据模型知道您对数据库所做的更改,因为它们现在不再与基础表同步
但是,我不建议使用EF作为重载数据加载工具。首选SQL或ETL工具。当列为identity时,从实体框架插入记录将引发以下错误: 当identity\U insert设置为OFF时,无法在表“我的实体”中为identity列插入显式值。为避免错误,请设置实体属性StoreGeneratedPattern=Identity
西蒙,我只迁移了价值30-40k的记录。。。我希望在EF中使用快速脏迁移工具,因为我对原始SQL有点生疏。LOL。在问这个问题之前,我确实看过上面的文章。EF不能很好地使用标识列进行迁移。我们离开EF&使用basicsqlclientlibrary和Sql命令进行迁移。或者您可以使用元数据来创建和执行原始SQL。此文件在何处本地化?
<EntityType Name="MY_ENTITY">
<Key>
<PropertyRef Name="UserID" />
</Key>
<Property Name="RecordID" Type="int" StoreGeneratedPattern="Identity" Nullable="false" />
</EntityType>
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<EntityClass>().HasKey(p => p.Id);
modelBuilder.Entity<EntityClass>()
.Property(c => c.Id)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
base.OnModelCreating(modelBuilder);
}