指定的列数必须与主键列数 EF 匹配
The number of columns specified must match the number of primary key columns EF
我有两个 table 具有复合 pk。 TABLE1 的 pk 进入 TABLE2,它们具有一对一的可选关系,即 TABLE1 可能有 1 个 TABLE2 或 0 个 TABLE2。当我插入数据时,我在创建模型时遇到以下异常。
The specified association foreign key columns 'third_table_id, fourth_table_id' are invalid. The number of columns specified must match the number of primary key columns.
如有任何帮助,我们将不胜感激。 table 1 的 pk 来自 table 3
我将映射 TABLE1 定义为:
#region 属性
Property(p => p.THIRDTABLEID).HasColumnName("third_table_id").HasDatabaseGeneratedOption(DatabaseGeneratedOption.None).IsRequired();
Property(p => p.FOURTHTABLEID).HasColumnName("fourth_table_id").HasDatabaseGeneratedOption(DatabaseGeneratedOption.None).IsRequired();
Property(p => p.SEQID).HasColumnName("Seq_ID").HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity).IsRequired();
#endregion PROEPRTIES
#region IGNORE
Ignore(p => p.RowState);
#endregion IGNORE
#region IGNORE
ToTable("dbo.TABLE1");
#endregion IGNORE
#region KEYS
// HasKey(t => new { t.THIRDTABLEID, t.FOURTHTABLEID });
HasKey(t => t.THIRDTABLEID);
HasKey(t => t.FOURTHTABLEID);
#endregion KEYS
#region RELATIONSHIPS
//relationship
HasRequired(t => t.THIRDTABLEID).WithMany(c => c.TABLE1).HasForeignKey
(t => t.THIRDTABLEID).WillCascadeOnDelete(false);
//relationship
HasRequired(t => t.SESN).WithMany(c => c.TABLE1).HasForeignKey
(t => t.SESSIONID).WillCascadeOnDelete(false);
#endregion RELATIONSHIPS
另一个TABLE2为:
#region PROPERTIES
Property(p => p.BPROLEDETLID).HasColumnName("bp_role_detl_id").HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity).IsRequired();
Property(p => p.THIRDTABLEID).HasColumnName("third_table_id").HasDatabaseGeneratedOption(DatabaseGeneratedOption.None).IsRequired();
Property(p => p.FOURTHTABLEID).HasColumnName("fourth_table_id").HasDatabaseGeneratedOption(DatabaseGeneratedOption.None).IsRequired(); ;
Property(p => p.abc).HasColumnName("abc").IsOptional();
#endregion PROPERTIES
#region IGNORE
Ignore(p => p.RowState);
#endregion IGNORE
#region TABLE MAPPING
ToTable("dbo.TABLE2");
#endregion
#region KEYS
HasKey(t => new {t.THIRDTABLEID, t.FOURTHTABLEID});
//HasKey(t => t.THIRDTABLEID);
//HasKey(t => t.FOURTHTABLEID);
#endregion KEYS
#region RELATIONSHIPS
//relationship
HasRequired(t => t.TABLE1).WithOptional(c => c.TABLE1_DETL).Map(
m=> m.MapKey(
"third_table_id",
"fourth_table_id"
)).WillCascadeOnDelete(false);
#endregion RELATIONSHIPS
您的第一个 table 是两次使用 HasKey,而不是创建复合键。第二条语句只是要覆盖第一条,所以看起来 Table 1 有一个主键,而 Table 2 有一个两列的组合键。这就是它告诉您列数必须匹配的原因。
我有两个 table 具有复合 pk。 TABLE1 的 pk 进入 TABLE2,它们具有一对一的可选关系,即 TABLE1 可能有 1 个 TABLE2 或 0 个 TABLE2。当我插入数据时,我在创建模型时遇到以下异常。
The specified association foreign key columns 'third_table_id, fourth_table_id' are invalid. The number of columns specified must match the number of primary key columns.
如有任何帮助,我们将不胜感激。 table 1 的 pk 来自 table 3
我将映射 TABLE1 定义为: #region 属性
Property(p => p.THIRDTABLEID).HasColumnName("third_table_id").HasDatabaseGeneratedOption(DatabaseGeneratedOption.None).IsRequired();
Property(p => p.FOURTHTABLEID).HasColumnName("fourth_table_id").HasDatabaseGeneratedOption(DatabaseGeneratedOption.None).IsRequired();
Property(p => p.SEQID).HasColumnName("Seq_ID").HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity).IsRequired();
#endregion PROEPRTIES
#region IGNORE
Ignore(p => p.RowState);
#endregion IGNORE
#region IGNORE
ToTable("dbo.TABLE1");
#endregion IGNORE
#region KEYS
// HasKey(t => new { t.THIRDTABLEID, t.FOURTHTABLEID });
HasKey(t => t.THIRDTABLEID);
HasKey(t => t.FOURTHTABLEID);
#endregion KEYS
#region RELATIONSHIPS
//relationship
HasRequired(t => t.THIRDTABLEID).WithMany(c => c.TABLE1).HasForeignKey
(t => t.THIRDTABLEID).WillCascadeOnDelete(false);
//relationship
HasRequired(t => t.SESN).WithMany(c => c.TABLE1).HasForeignKey
(t => t.SESSIONID).WillCascadeOnDelete(false);
#endregion RELATIONSHIPS
另一个TABLE2为:
#region PROPERTIES
Property(p => p.BPROLEDETLID).HasColumnName("bp_role_detl_id").HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity).IsRequired();
Property(p => p.THIRDTABLEID).HasColumnName("third_table_id").HasDatabaseGeneratedOption(DatabaseGeneratedOption.None).IsRequired();
Property(p => p.FOURTHTABLEID).HasColumnName("fourth_table_id").HasDatabaseGeneratedOption(DatabaseGeneratedOption.None).IsRequired(); ;
Property(p => p.abc).HasColumnName("abc").IsOptional();
#endregion PROPERTIES
#region IGNORE
Ignore(p => p.RowState);
#endregion IGNORE
#region TABLE MAPPING
ToTable("dbo.TABLE2");
#endregion
#region KEYS
HasKey(t => new {t.THIRDTABLEID, t.FOURTHTABLEID});
//HasKey(t => t.THIRDTABLEID);
//HasKey(t => t.FOURTHTABLEID);
#endregion KEYS
#region RELATIONSHIPS
//relationship
HasRequired(t => t.TABLE1).WithOptional(c => c.TABLE1_DETL).Map(
m=> m.MapKey(
"third_table_id",
"fourth_table_id"
)).WillCascadeOnDelete(false);
#endregion RELATIONSHIPS
您的第一个 table 是两次使用 HasKey,而不是创建复合键。第二条语句只是要覆盖第一条,所以看起来 Table 1 有一个主键,而 Table 2 有一个两列的组合键。这就是它告诉您列数必须匹配的原因。