2016-11-04 60 views
0

我得到了一个项目,其中使用了EF6代码。我有2个类,其中设置了一对多关系,在Fluent API中也设置了相同的关系。实体框架6先一对一地代码而不是一对多

当我在同一个步骤中创建父/子都一切都很好并保存,但是当我先创建父,保存它,然后我想添加一个孩子我有一个异常,指出这两个实体是关系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;} 
} 

流利的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. 
+0

所以,你想从一个关系改变了许多,以一对一? – user449689

+0

我也想过,但首先我想知道是否有任何方法可以使它在当前关系中工作,同时我也不知道EF从1到0..1的关系。我想知道这个问题来自哪里,所以我可以看看它是否可以修复或需要改变关系。 – Mony

+0

请更新的问题张贴你得到 – user449689

回答

0

考虑给你的孩子的ParentId属性

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

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

如果你这样做,你跟着code-first conventions (click to view)。如果遵循约定,Entity Framework会理解父 - 子是一对多的关系:父母有零个或多个孩子,而孩子只有一个父母。

有关下列约定的好处是,你不需要你的流畅API语句。实体框架知道,父母是必需的,父有许多儿童和外键的父的ParentId

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

添加的ParentId后,您可以添加父,后来添加的孩子

public class Parent 
{ 
    public int ParentId {get; set;} 
    public string Name {get; set;} 

    public virtual ICollection<Child> Children {get; set;} 
} 

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

    // By convention will become the foreign key to Parent: 
    public int ParentId {get; set;} 
    public virtual Parent Parent {get; set;} 
} 

public class MyDbContext : DbContext 
{ 
    public DbSet<Parent> Parents {get; set;} 
    public DbSet<Child> Children {get; set;} 
} 

public void Main() 
{ 
    using (var dbContext = new MyDbContext(...)) 
    { 
     var addedParent = dbContext.Parents.Add(new Parent() 
     { 
      Name = "Phil Dunphy", 
     } 

     // if you do not want to add a child now, you can SaveChanges 
     dbContext.SaveChanges(); 

     // now addedParent has a ParentId, you can add a child: 
     var addedChild = dbContext.Children.Add(new Child() 
     { 
      Name = "Luke Dunphy", 
      ParentId = addedParent.Id, 
     }; 
     dbContext.SaveChanges(); 
    } 
} 
+0

当我改变我的模型类这种方式,然后尝试增加孩子已经存在的父母,我得到异常'INSERT语句与FOREIGN KEY约束“FK_dbo.Children_dbo.Parents_ParentId”冲突。冲突发生在数据库“CLDash0001”,表“dbo.Parents”,列'ParentId'。' – Mony

+0

除了输入错误,程序运行在我的解决方案中。是否有问题,因为您在已经存在的数据库中执行此操作,并且您更改了数据库模型?只需使用Parent/Child/MyDbContext在空项目中尝试此代码即可。在DbContext的构造函数中传递一个不存在的数据库的名称,因此它将为您创建。 –

+0

不这样认为,我也模型类与您发布相同的代码,所以它不是数据库的问题,我认为这个问题是在保存的地方,在负责正确添加键等代码。代码非常复杂,添加条目后没有'SaveChanges()'调用,所有内容都立即保存,它是一个步骤很少的向导,''从父控制器调用'SaveChanges()',其中的方法更新因为直到此刻所有条目都保存在TempData []中 – Mony

相关问题