【问题标题】:Unable to determine the principle end of the relationship - multiple added entities may have the same primary key无法确定关系的主体结束 - 多个添加的实体可能具有相同的主键
【发布时间】:2013-02-16 07:49:11
【问题描述】:

套装有卡片和套装。这是我的模型中的内容,使用 EF Code First:

public class Set
{
    // Primitive Properties 
    [Required]
    [Key]
    public virtual int SetId { get; set; }

    // Navigation Properties 
    [Required]
    public virtual List<Set> Sets { get; set; }

    // Navigation Properties
    [ForeignKey("ParentSet")]
    public int ParentSetId { get; set; }
    public virtual Set ParentSet { get; set; }
}

然后对于卡片:

public class Card
{
    // Primitive Properties
    [Required]
    [Key]
    public virtual int CardId { get; set; }

    // Navigation Properties
    [Required]
    [ForeignKey("ParentSet")]
    public int ParentSetId { get; set; }
    public virtual Set ParentSet { get; set; }
}

我正在尝试使用包管理器控制台中的“update-database”重建数据库,这是我得到的错误:

无法确定主端 'App.Core.Set_ParentSet' 关系。多个添加的实体 可能有相同的主键。

知道为什么吗?

【问题讨论】:

  • 我没有得到 Set 表中的关系。 uml 模型会是什么样子?为什么一个集合需要一个自身的列表?
  • 集合是自引用的……因为一个集合可以有很多集合。像一个 Box 可以有很多 Box,并且可能属于一个 Box。这是否允许?
  • 我不确定。我不知道 EF 将如何调和这种关系。我会考虑将 ParentSets 和/或 SubSets 与 PrimarySet 分开定义。
  • 虽然,我可以看到阅读像foreach(Set set in Set.Sets)这样的代码会有多有趣
  • 我讨厌对这个问题投反对票,但@RobVious 似乎已将答案标记为答案,但根据他的 cmets,它并不能解决问题。请取消将该答案标记为答案或解释它是如何解决问题的。我真的希望有任何解决方案在这里有效。

标签: c# entity-framework exception-handling ef-code-first


【解决方案1】:

对我来说,在 Set 实体中有这个没有意义。它不能引用自己并且是必需的

// Navigation Properties 
[Required]
public virtual List<Set> Sets { get; set; }

如果Set 必须有Sets 的列表,您如何创建第一个Set

请注意,从错误中写的内容来看,它与 Card 类无关

【讨论】:

  • 感谢马修的帮助。我正在尝试确保 List 已实例化,因此在执行 Sets.Count 之类的操作之前不必检查 isNull。列表应该始终存在,但并不总是包含集合。想法?
  • 我之前尝试过同一个实体内部的关系。它不起作用。您最好拥有一个“公共虚拟整数”属性? ParentSetId { 得到;放; }'
  • 我删除了Required,它仍然在发生。请注意,在我指定 ForeignKey 属性之前,这并没有发生...我应该将其关闭并继续吗?
  • 我不明白为什么这被标记为答案。 @RobVious 明确表示它没有解决问题,对吧?我正在寻找完全相同的问题的解决方案。
【解决方案2】:

如果您只是想避免因新实例化 Set 而没有 Sets 而出现空错误,那么处理此问题的正确方法是在构造函数中实例化 Sets

public class Set
{
    public Set()
    {
        Sets = new List<Set>();
    }

    ...
}

【讨论】:

    猜你喜欢
    • 2013-09-15
    • 2016-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-27
    • 2018-02-08
    相关资源
    最近更新 更多