指定的列数必须与主键列EF的数量相匹配 [英] The number of columns specified must match the number of primary key columns EF

查看:163
本文介绍了指定的列数必须与主键列EF的数量相匹配的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有两张有复合pk的表。 TABLE1的pk进入TABLE2,它们具有一到一个可选关系,即TABLE1可能有1个TABLE2或0 TABLE2。当我插入数据时,我会在模型创建时得到以下异常。


指定的关联外键列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屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆