【问题标题】:Self reference in Entity Framework实体框架中的自引用
【发布时间】:2016-10-19 05:16:23
【问题描述】:

我有一个表,我希望有两个自外键作为下一个和上一个。

如下图:

public class BoxDefinition : ISiblingable
    {
        public int BoxDefinitionId { get; set; }
        public string Name { get; set; }
        public byte[] Photo { get; set; }
        public bool Active { get; set; }
        [ForeignKey("Next")]
        public int? NextId { get; set; }
        [ForeignKey("Previous")]
        public int? PreviousId { get; set; }

        public BoxDefinition Next { get; set; }
        public BoxDefinition Previous { get; set; }
        //public virtual ICollection<BoxDefinition> NextSiblings { get; set; }
        //public virtual ICollection<BoxDefinition> PreviousSiblings { get; set; }

        public static BoxDefinition GetById(int id, IContext context)
        {
            return context.BoxDefinitions.SingleOrDefault(b => b.BoxDefinitionId == id);
        }
    }

当我取消注释这两个集合时,一切正常,但在这个实体中我确实需要很多,因为每个实例只有一个 next 和 previous 或 null。

这是错误:

BoxDefinition_Previous_Target: : 多重性在角色中无效 关系中的“BoxDefinition_Previous_Target” 'BoxDefinition_Previous'。因为从属角色属性是 不是关键属性,多重性的上限 从属角色必须是“*”。

Entity Framework 可能认为应该有 Collection,因为可能有很多引用,但我知道不会。

有什么想法吗?

【问题讨论】:

    标签: c# entity-framework


    【解决方案1】:

    另外你应该添加InverseProperty属性:

    public class BoxDefinition : ISiblingable
    {
         //other stuff....
         [ForeignKey("Next")]
         [Index(IsUnique = true)]        
         public int? NextId { get; set; }
    
         [ForeignKey("Previous")]
         [Index(IsUnique = true)]        
         public int? PreviousId { get; set; }
    
         public BoxDefinition Next { get; set; }
         public BoxDefinition Previous { get; set; }
    
         [Obsolete]
         [InverseProperty("Next")]
         public virtual ICollection<BoxDefinition> NextSiblings { get; set; }
    
         [Obsolete]
         [InverseProperty("Previous")]
         public virtual ICollection<BoxDefinition> PreviousSiblings { get; set; }
    }
    

    不幸的是,您应该声明这些属性以便正确导航,但您可以简单地忽略它们并用Obsolete 属性标记以保留关于这个事实的信息。您还可以为 NextIdPreviousId 字段添加唯一索引,以确保关系仅是一对一的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多