当我将它们插入到我的DbContext中时,为某些记录指定主键

时间:2012-08-07 08:52:25

标签: sql-server entity-framework ef-code-first identity

有时,我需要插入一个特定的ID作为我正在添加到我的数据的实体的主键。在传统的MS SQL中,您可以在调用SET IDENTITY_INSERT tablename ON语句之前调用INSERT INTO来完成此操作。我似乎无法找到使用EF 4.1 Code First做同样的方法。

Dim specificIdRecord As New Record() With {
    .RecordID = 25,
    'other settings here
}

myDbContext.Records.Add(specificIdRecord)
myDbContext.SaveChanges()

specificIdRecord.RecordID '<== this does not always equal 25!

也没有错误告诉我它忽略了我的RecordID并自动生成一个。

注意:我不想modify my modelmodify my context,因为这仅适用于偶尔的插入操作。另外,我确实看到possible solution使用ExecuteStoreCommand在插入运行之前和之后手动设置IDENTITY_INSERT,但这将需要三个事务AFAIK,我希望EF将这一切全部包装成之一。

1 个答案:

答案 0 :(得分:1)

EF不支持此功能。如果您在数据库中使用IDENTITY列,则映射包含此信息,您永远不能将密钥值发送到数据库(EF将自动跳过它)。

在这种情况下,最好的选择是使用ExecuteStoreCommand来设置IDENTITY_INSERTINSERT SQL命令。

任何基于EF的解决方法都需要两个不同的EF映射:一个将密钥集设置为生成数据库,另一个没有此设置。当您要插入显式键值时,将使用第一个映射进行常见处理,使用第二个映射。使用两个映射意味着使用两个不同的EDMX文件或两个不同的DbModelBuilder实例(两个上下文类型)。

一旦你有两个映射,你仍然需要打开和关闭IDENTITY_INSERT来解决问题。这将要求您创建自定义提供程序包装器,以将这些SQL命令附加到每个生成的INSERT命令。