【问题标题】:The number of columns specified must match the number of primary key columns EF指定的列数必须与主键列数 EF 匹配
【发布时间】:2015-01-27 14:53:30
【问题描述】:

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

指定的关联外键列'third_table_id,fourth_table_id'无效。指定的列数必须与主键列数匹配。

任何帮助将不胜感激。表1的pk来自表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

【问题讨论】:

  • 您的第一个表使用 HasKey 两次,而不是创建复合键。第二个语句只是要覆盖第一个语句,所以看起来表 1 有一个主键,而表 2 有一个由两列组成的复合键。这就是为什么它告诉你列数必须匹配。
  • 问题是,当我这样做时,另一个异常说每个类型中的属性名称必须是唯一的。属性名称 'fourth_table_id' 已被定义。
  • @Dismissile 你是对的。我在另一张桌子上错过了同样的事情,现在问题解决了。请发表您的评论作为答案,以便我可以标记它。谢谢

标签: c# sql entity-framework ef-code-first


【解决方案1】:

您的第一个表使用 HasKey 两次,而不是创建复合键。第二个语句只是要覆盖第一个语句,所以看起来表 1 有一个主键,而表 2 有一个由两列组成的复合键。这就是为什么它告诉你列数必须匹配。

【讨论】:

  • 如果表#1 有单个pkey,表#2 有两个pkey,一个到表#1,另一个到其他表怎么办?在那种情况下,我敢打赌,对这个问题的解释不是答案。 :( 我会继续研究,一定是一种正确映射()它们的方法。
猜你喜欢
  • 1970-01-01
  • 2020-09-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-24
  • 1970-01-01
  • 1970-01-01
  • 2020-04-21
  • 2015-09-18
相关资源
最近更新 更多