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
,所以,A
和B
默认是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 列作为主键。
我在 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
,所以,A
和B
默认是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 列作为主键。