实体框架:IDENTITY_INSERT问题-“;无法在表“”中插入标识列的显式值;
本文关键字:插入 标识 IDENTITY 框架 INSERT 问题 实体 | 更新日期: 2023-09-27 18:27:15
我正在使用带有C#的Entity Framework 4.0。我正在尝试创建一个"简单"的迁移工具来将数据从一个表转换到另一个表(表不相同)
该数据库是SQL Server 2005。
我有一个类似于以下的目标数据库结构:
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会用Identity值覆盖MYID的值。
到目前为止,无论我在哪里添加了"myDB.ExecuteStoreCommand("SET IDENTITY_INSERT SR_Info ON");",它的行为都是一样的。
我尝试添加一个存储过程,但它也不起作用。
我怀疑迁移最终不会完全自动化。
当列为标识时,从实体框架插入记录将引发以下错误:
当identity_insert设置为OFF时,无法在表"MY_ENTITY"中插入标识列的显式值。为避免错误,请设置实体属性StoreGeneratedPattern="identity"
<EntityType Name="MY_ENTITY">
<Key>
<PropertyRef Name="UserID" />
</Key>
<Property Name="RecordID" Type="int" StoreGeneratedPattern="Identity" Nullable="false" />
</EntityType>
将IDENTITY_INSERT与EF4 一起使用看起来很有前景
您基本上需要确保您的数据模型知道您对数据库所做的更改,因为它们现在不再与基础表同步。
但是,我不建议使用EF作为一个重数据加载工具。首选SQL或ETL工具。
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);
}