指定的列数必须与主键列EF的数量相匹配 [英] The number of columns specified must match the number of primary key columns EF
问题描述
指定的关联外键列third_table_id,four_table_id无效。指定的列数必须与主键列数匹配。
任何帮助将不胜感激。表1的pk来自表3
我将映射TABLE1定义为:
#region PROPERTIES
属性(p => p.THIRDTABLEID).HasColumnName(third_table_id)。HasDatabaseGeneratedOption(DatabaseGeneratedOption.None).IsRequired();
属性(p => p.FOURTHTABLEID).HasColumnName(fourth_table_id)。HasDatabaseGeneratedOption(DatabaseGeneratedOption.None).IsRequired();
属性(p => p.SEQID).HasColumnName(Seq_ID)。HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity).IsRequired();
#endregion PROEPRTIES
#region 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关系
//关系
HasRequired(t => t.THIRDTABLEID).WithMany c => c.TABLE1).HasForeignKey
(t => t.THIRDTABLEID).WillCascadeOnDelete(false);
//关系
HasRequired(t => t.SESN).WithMany(c => c.TABLE1).HasForeignKey
(t => t.SESSIONID ).WillCascadeOnDelete(假);
#endregion关系
其他TABLE2为:
#region PROPERTIES
属性(p => p.BPROLEDETLID).HasColumnName(bp_role_detl_id)。HasDatabaseGeneratedOption (DatabaseGeneratedOption.Identity).IsRequired();
属性(p => p.THIRDTABLEID).HasColumnName(third_table_id)。HasDatabaseGeneratedOption(DatabaseGeneratedOption.None).IsRequired();
属性(p => p.FOURTHTABLEID).HasColumnName(fourth_table_id)。HasDatabaseGeneratedOption(DatabaseGeneratedOption.None).IsRequired(); ;
属性(p => p.abc).HasColumnName(abc)。IsOptional();
#endregion PROPERTIES
#region 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关系
//关系
HasRequired(t => t.TABLE1 ).WithOptional(c => c.TABLE1_DETL).Map(
m => m.MapKey(
third_table_id,
fourth_table_id
))。WillCascadeOnDelete(false);
#endregion关系
您的第一张表正在使用HasKey两次,而不是创建一个复合键。第二个语句只是覆盖第一个,所以看起来表1有一个主键,而表2有一个两列的复合键。这就是为什么告诉你列必须匹配的数量。
I have two tables having composite pk's. The pk of TABLE1 goes into TABLE2 and they have a one to one optional relationship i.e TABLE1 may have 1 TABLE2 or 0 TABLE2. I get the following exception on model creation when I insert data.
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.
Any help would be appreciated. The pk's of the table 1 come from table 3
I have defined the mapping TABLE1 as: #region PROPERTIES
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
and the other TABLE2 as:
#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
Your first table is using HasKey twice, instead of creating a composite key. The second statement is just going to override the first one, so it looks like Table 1 has a single primary key, while Table 2 has a composite key of two columns. That's why it's telling you the number of columns must match.
这篇关于指定的列数必须与主键列EF的数量相匹配的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!