有时,我需要插入一个特定的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 model或modify my context,因为这仅适用于偶尔的插入操作。另外,我确实看到possible solution使用ExecuteStoreCommand
在插入运行之前和之后手动设置IDENTITY_INSERT
,但这将需要三个事务AFAIK,我希望EF将这一切全部包装成之一。
答案 0 :(得分:1)
EF不支持此功能。如果您在数据库中使用IDENTITY
列,则映射包含此信息,您永远不能将密钥值发送到数据库(EF将自动跳过它)。
在这种情况下,最好的选择是使用ExecuteStoreCommand
来设置IDENTITY_INSERT
和INSERT
SQL命令。
任何基于EF的解决方法都需要两个不同的EF映射:一个将密钥集设置为生成数据库,另一个没有此设置。当您要插入显式键值时,将使用第一个映射进行常见处理,使用第二个映射。使用两个映射意味着使用两个不同的EDMX文件或两个不同的DbModelBuilder
实例(两个上下文类型)。
一旦你有两个映射,你仍然需要打开和关闭IDENTITY_INSERT
来解决问题。这将要求您创建自定义提供程序包装器,以将这些SQL命令附加到每个生成的INSERT
命令。