我有一个复合键映射到类中,如下所示:
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
答案 0 :(得分:2)
如果Key字段是Integer,则Code First默认为
DatabaseGeneratedOption.Identity
,因此,A
和B
默认为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列定义为主键。