实体框架中的自我引用

时间:2016-06-17 11:23:21

标签: c# entity-framework

我有桌子,我希望有两个自己的外键,如下一个和上一个。

这是它的样子:

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 :: Multiplicity在Role中无效   关系中的'BoxDefinition_Previous_Target'   'BoxDefinition_Previous'。因为依赖角色属性是   不是关键属性,多重性的上限   依赖角色必须是'*'。

实体框架可能认为应该有Collection,因为可能有很多引用,但我知道它不会。

有什么想法吗?

1 个答案:

答案 0 :(得分: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字段添加唯一索引,以确保关系仅为一对一。