我有一个表,它为表的某些行存储一些额外的数据,例如:
public class QuoteExtra
{
[Key]
public int QuoteId { get; set; }
// More fields here
}
我希望能够在我明确设置 PK 的表中添加行。
如果我只是像上面那样保留它,设置一个值并提交该行会导致该值被丢弃并替换为数据库中自动生成的值(并且该列被定义为实际模式中的 Identity 列)。
这似乎是正确的解决方案:
public class QuoteExtra
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int QuoteId { get; set; }
// More fields here
}
然而,这反而让我例外:
当 IDENTITY_INSERT 设置为 OFF 时,无法在表“EnumTest”中插入标识列的显式值。
那么,如何编写我的课程以便能够在 EF 中设置主键的值?
编辑:
我尝试添加以下基于代码的迁移以将 IDENTITY_INSERT 设置为 ON:
public override void Up()
{
Sql("SET IDENTITY_INSERT QuoteExtra ON");
}
我运行它并再次尝试,但得到与上述相同的异常。奇怪的是数据库确实反映了这个设置,并且直接对它运行 SQL 确实允许我为主键插入任意值 - 所以看起来实体框架本身正在执行这个规则,并且忽略了识别 IDENTITY_INSERT 不在事实设置为关闭。我需要在 EF 本身的某个地方设置它吗?
编辑2:
我误解了 IDENTITY_INSERT;我假设设置它曾经无限期地留在那张桌子上。事实上,它的存在时间与“会话”一样长,这意味着例如将其设置为迁移意味着它存在......只要迁移运行,并且与我后来的 .Add() 与 EF 的未来连接无关,这就解释了为什么我仍然得到那个异常 - 数据库确实是异常的来源,而不是 EF。由于 IDENTITY_INSERT 被限制为每个会话最多一个表,这是一种相当低效的方法 - 首先不创建 Identity PK 列似乎是一条更好的路线。