Entity Framework 当其中之一是身份时的复合主键

Entity Framework Composite primary key when one of them is an identity

我在 class 中映射了一个复合键,如图所示:

HasKey(l => new { l.A, l.B });

但是,这里的A应该是一个身份。

Property(l => l.A).HasColumnName("A").HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
Property(l => l.B).HasColumnName("B");

但是,当我尝试添加一个值为 A(null,因为它是一个标识)和 B 的对象时,我遇到了主键冲突。

有什么办法可以解决这个问题吗?

类型如下:

public Int64? A{ get; set; } //Identity
public int B { get; set; }

来自数据库世界:

A   bigint
B   int

在Key字段为整数的情况下,Code First默认为 DatabaseGeneratedOption.Identity,所以,AB默认是Identity。您需要指定 B 不是 Identity。试试这个配置:

Property(l => l.A).HasColumnName("A");
Property(l => l.B).HasColumnName("B").HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);

顺便说一句,为什么 A 可以为空? PK 为 table 中的每一行定义了一个唯一标识符,因此,由于 A 是身份,当您在 table 中插入新行时,您总是会在该列中有一个值。 =16=]

似乎即使在复合主键中也不允许有空值。如前所述 here,解决方法是定义一个单独的 Id 列作为主键。