实体框架复合主键,当其中一个是标识时

时间:2015-01-22 21:08:45

标签: c# entity-framework ef-fluent-api

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

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

2 个答案:

答案 0 :(得分:2)

如果Key字段是Integer,则Code First默认为 DatabaseGeneratedOption.Identity,因此,AB默认为Identity。您需要指定B不是身份。尝试使用此配置:

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

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

答案 1 :(得分:0)

即使在复合主键中,似乎也不允许使用空值。如上所述here,解决方法是将分隔的Id列定义为主键。