实体框架6首先一对一代码而不是一对多代码

时间:2016-11-04 08:02:42

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

我接手了一个首先使用EF6代码的项目。我有2个类,其中设置了一对多关系,在Fluent API中设置相同。

当我在同一步骤中创建父/子时一切都很好并保存,但是当我首先创建父,保存它然后我想添加一个孩子我得到一个异常,表明这两个实体在关系1到0..1并且不保存。

有没有办法先创建父项,然后再添加一个子项?

模型类:

public class Parent
{
    public int ParentId {get; set;}
    public virtual ICollection<Child> Children {get; set;}
}

public class Child
{
    public int ChildId {get; set;}
    public virtual Parent Parent {get; set;}
}

Fluent API:

modelBuilder.Entity<Child>()
                     .HasRequired<Parent>(s => s.Parent)
                     .WithMany(s => s.Children)
                     .HasForeignKey(s => s.ParentId);

在数据库中,我看到了外键ParentId。如果我是对的,父母可以在没有孩子的情况下生活所有内容都以dbContext.SaveChanges()

保存

例外:

Exception thrown: 'System.Exception' in Project.dll

Additional information: Multiplicity constraint violated. The role 'Child_Parent_Target' of the relationship 'Project.DAL.Child_Parent' has multiplicity 1 or 0..1.

1 个答案:

答案 0 :(得分:0)

考虑给孩子一个ParentId属性

Select(driver.find_element_by_xpath("//select[@name='name']")).select_by_visible_text(" ")

如果您这样做,请按照 code-first conventions (click to view) 进行操作。如果遵循惯例,实体框架会理解父 - 子是一对多的关系:父母有零个或多个孩子,而孩子只有一个父母。

遵循惯例的好处是您不需要流畅的API语句。实体框架知道父级是必需的,父级有多个子级,父级的外键是ParentId

回到你的问题。将ParentId添加到您的孩子后,您可以添加没有孩子的父母,并在以后添加孩子。

添加ParentId后,您可以添加父级并稍后添加子级

public class Child
{
    public int ChildId {get; set;}

    public int ParentId {get; set;}
    public virtual Parent Parent {get; set;}
}