实体框架多对一

时间:2017-08-23 15:07:16

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

我想使用代码第一实体框架来设置父实体两个子实体的实例,每个实例都有一对一的关系。

我尝试使用以下型号: -

public class Parent
{
    [Key]
    public int Id { get; set; }

    public virtual Child FirstChild { get; set; }

    public virtual Child SecondChild { get; set; }
}

public class Child
{
    [Key, ForeignKey("Parent")]
    public int ParentId{ get; set; }

    public Parent Parent { get; set; }
}

然而,当我尝试将一个孩子添加到父母时,我得到以下异常: -

context.Add(new Parent
{
    FirstChild = new Child(),
    SecondChild = new Child()
});
context.SaveChanges();
  

System.Data.Entity.Infrastructure.DbUpdateException:冲突   检测到变化。尝试插入多个时可能会发生这种情况   具有相同密钥的实体。

我认为这意味着代码试图将FirstChild和SecondChild设置为使用与Parent Id相同的Id,这是无效的,因为它们不能都具有相同的主键。有没有办法配置模型以允许两个一对一链接?

1 个答案:

答案 0 :(得分:0)

你想要的不是一对一的映射。如果你认为深入是一个到两个映射。 为了使其在EF中工作,您需要映射为一对多关系并隐藏集合属性以防止外部使用。

public class Parent
{
    [Key]
    public int Id { get; set; }

    protected virtual List<Child> Children {get; set;}

    [NotMapped]
    public Child FirstChild 
    { 
         get{ return Children[0]; }
         set{ Children[0] = value; } 
    }

    [NotMapped]
    public Child SecondChild 
    { 
         get{ return Children[1]; }
         set{ Children[1] = value; } 
    }
}

public class Child
{
    [Key, ForeignKey("Application")]
    public int ApplicationId { get; set; }

    [Key, ForeignKey("Parent")]
    public int ParentId { get; set; }
    [Key]
    public int Id { get; set; }

    public Parent Parent { get; set; }
}

您可能需要使用ModelBuilder配置来映射它,因为属性不够强大。