我有桌子,我希望有两个自己的外键,如下一个和上一个。
这是它的样子:
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,因为可能有很多引用,但我知道它不会。
有什么想法吗?
答案 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
属性标记以保留此事实。您还可以向NextId
和PreviousId
字段添加唯一索引,以确保关系仅为一对一。