我想使用代码第一实体框架来设置父实体两个子实体的实例,每个实例都有一对一的关系。
我尝试使用以下型号: -
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,这是无效的,因为它们不能都具有相同的主键。有没有办法配置模型以允许两个一对一链接?
答案 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配置来映射它,因为属性不够强大。