注意:版主删除了这个答案作为重复,并留下了我的另一个答案,一个只有 sql-server 标签的问题(这是我从谷歌得到的第一个问题)。由于这个问题有实体框架标签,所以在这里再次发布答案。
这适用于 EntityFramework Core 3.1.22。使用错误的属性来指定外键会导致 Entity Framework 将主键降级为……其他东西。然后,实体框架将始终尝试插入显式值,这会引发数据库异常,因为它无法插入被告知是主键且不应插入的值。
Microsoft.EntityFrameworkCore.DbUpdateException: 'An error occurred while updating the entries. See the inner exception for details.'
Inner Exception:
SqlException: Cannot insert explicit value for identity column in table 'FOO' when IDENTITY_INSERT is set to OFF.
代码示例。我们有一个一对一的类映射:
public class Foo /* child */
{
public int FooPrimaryKey { get; set; }
public int BarPrimaryKey { get; set; }
public virtual Bar PropertyBar {get; set; }
}
public class Bar
{
public int BarPrimaryKey { get; set; }
public virtual Foo PropertyFoo {get; set; }
}
modelBuilder.Entity<Foo>(entity =>
{
entity.HasKey(e => e.FooPrimaryKey);
entity.ToTable("FOO", "dbo");
entity.HasOne(d => d.PropertyBar)
.WithOne(x => x.PropertyFoo)
// wrong, this throws the above exception
.HasForeignKey<Bar>(x => x.BarPrimaryKey);
});
外键应该是(相同的键,不同的类型):
.HasForeignKey<Foo>(x => x.BarPrimaryKey);