-1

有时,我需要插入特定 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 并自动生成一个。

注意:我不想修改我的模型修改我的上下文,因为这仅适用于偶尔的插入操作。此外,我确实看到了一种可能的解决方案ExecuteStoreCommand用于手动设置IDENTITY_INSERT插入运行之前和之后,但这将需要三个事务 AFAIK,我希望 EF 将这一切打包成一个。

4

1 回答 1

1

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

在这种情况下,最好的选择是ExecuteStoreCommand同时用于设置IDENTITY_INSERTINSERTSQL 命令。

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

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

于 2012-08-07T09:29:39.190 回答