【问题标题】:The number of properties in the Dependent and Principal Roles in a relationship constraint must be identical?关系约束中的 Dependent 和 Principal Roles 中的属性数量必须相同吗?
【发布时间】:2016-02-11 06:44:02
【问题描述】:

ConsumerNM 是一个 NM/桥表/实体。

它与事件表是 1:N 关系。

当我进行插入时,我得到了问题标题异常。

我必须改变什么才能让它工作?

我是否必须创建 2 个外键,每个外键都指向另一个 ConsumerNM_Key?

 public class ConsumerNM
 {
        public ConsumerNM()
        {
           Events = new HashSet<Event>();
        }

        [Key]
        [Column(Order = 0)]
        [DatabaseGenerated(DatabaseGeneratedOption.None)]
        public int FK_LEADMETA { get; set; }

        [Key]
        [Column(Order = 1)]
        [DatabaseGenerated(DatabaseGeneratedOption.None)]
        public int FK_LEADCONSUMER { get; set; }

        public virtual ICollection<Event> Events { get; set; }      
}

 public class Event
    {
        [Key]
        public int Id { get; set; }

        public DateTime EventDate { get; set; }       

        public virtual ConsumerNM Consumer { get; set; }

        [ForeignKey("Consumer")]
        public int FK_Consumer { get; set; }

    }

【问题讨论】:

  • ConsumerNM的PK由FK_LEADMETAFK_LEADCONSUMER两个值组成。 Event 类的 FK 为 ConsumerNM,但它只有一个属性。 Event 必须有 FK_LEADMETAFK_LEADCONSUMER

标签: c# entity-framework entity-framework-6.1


【解决方案1】:

ConsumerNMEvent 不正确。你有两个选择:

第一个选项:

 public class ConsumerNM
 {
        //This is not a PK
        //[Key]
        //[Column(Order = 0)]
        //[DatabaseGenerated(DatabaseGeneratedOption.None)]
        public int FK_LEADMETA { get; set; }

        [Key]
        public int FK_LEADCONSUMER { get; set; }  
}

Event 保持不变。

第二个选项:

public class Event
{
    [Key]
    public int Id { get; set; }

    public DateTime EventDate { get; set; }       

    public virtual ConsumerNM Consumer { get; set; }

    [ForeignKey("Consumer")]
    public int FK_LEADCONSUMER { get; set; }

    [ForeignKey("Consumer")]
    public int FK_LEADMETA { get; set; }

}

ConsumerNM 保持不变。

【讨论】:

  • 我会选择第二个选项。我现在通过流利的api解决了它。那么ForeignKey及其字符串名称“Consumer”一定要和同一个类Event中的导航属性的属性名相同?
  • 是的,[ForeingKey()] 属性内的字符串必须与导航属性的名称相同。如果 FK 由多个值组成,则必须将 [ForeingKey] 放在所有值之上
  • 我以为我必须在 Event.cs 中做:ForeignKey("ParentTable.Key1,ParentTable.Key2") 逗号分隔。
  • 如果你把[ForeignKey] attr 放在导航属性中,那么你必须做ForeignKey("FK_LEADCONSUMER ,FK_LEADCONSUMER")]。如果您将[ForeignKey] attr 放在 FK 中,则必须为 FK 的每个值重复它(将导航属性的名称作为参数传递),如我的答案的第二个选项中所述
猜你喜欢
  • 2014-11-17
  • 1970-01-01
  • 2012-07-30
  • 2017-06-13
  • 2012-10-31
  • 2020-10-29
  • 1970-01-01
  • 2019-12-26
相关资源
最近更新 更多