1

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

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
4

2 回答 2

2

在 Key 字段为 Integer 的情况下,Code First 默认为 DatabaseGeneratedOption.Identity, so,A并且B默认为 Identity。您需要指定B不是身份。试试这个配置:

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

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

于 2015-01-22T21:38:03.573 回答
0

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

于 2015-01-22T22:06:48.433 回答