C# 实体框架重复记录

C# 实体框架重复记录,c#,database,entity-framework,C#,Database,Entity Framework,假设我有这个类: public class Element { [Key] public int ElementId { get; set; } public int? ParentId { get; set; } [ForeignKey("ParentId")] public virtual Element Parent { get; set; } [Required, MaxLength(100)] public string N

假设我有这个类:

public class Element
{
    [Key]
    public int ElementId { get; set; }

    public int? ParentId { get; set; }

    [ForeignKey("ParentId")]
    public virtual Element Parent { get; set; }

    [Required, MaxLength(100)]
    public string Name { get; set; }

    public Element(string name, Element parent)
    {
        Name = name;
        Parent = parent;
    }
}
现在当我

Element A = new Element("A", null);
Element B = new Element("B", A);
Element C = new Element("C", A);

Context.Elements.Add(A); 
Context.Elements.Add(B); 
Context.Elements.Add(C);

EF立即在数据库中写入A的三个副本。我如何告诉EF不要写入父元素,除非它不存在?

您是否在某处设置了它们的键?在我看来这不像EF代码。。。请发布更多信息?实体不应具有参数化构造函数。@KingKing“never”可能有点极端,但只要您也具有无参数构造函数,就可以接受它。当您始终可以使用属性初始值设定项时,声明参数化构造函数是无用的。另外,我认为为实体类声明参数化构造函数不是很合乎逻辑。请记住,它通常是数据库中某个表/视图的映射,所以只需使用无参数构造函数就可以了。这是一种应该始终有效的模式,但不确定其他方式。没有无参数构造函数,EF无法创建实体,这是主要原因。因此,当您添加一个带有参数的版本时,始终需要确保您也添加了无参数版本。