![](/img/trans.png)
[英]Entity Framework: Cannot insert explicit value for identity column in table '[table]' when IDENTITY_INSERT is set to OFF
[英]Entity Framework: Issue with IDENTITY_INSERT - “Cannot insert explicit value for identity column in table”
我正在使用带有C#.NET的Entity Framework 4.0。 我正在尝试创建一个“简单”的迁移工具,将数据从一个表转换为另一个表(表格不一样)
该数据库是SQL Server 2005。
我有一个类似于以下目标DB结构:
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数据库,然后是生产数据库,因此完全自动化将很好。
让这个工作正常的任何想法?
我使用了以下步骤:
此时,当我添加一个设置了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>
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);
}
这看起来很有希望使用IDENTITY_INSERT和EF4
您基本上需要确保您的数据模型知道您对数据库所做的更改,因为它们现在不再与基础表同步。
但是,我不建议使用EF作为重量级数据加载工具。 首选SQL或ETL工具。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.