保存实体时也保存导航数据



给定以下模型(我正在使用EF Core(:

public class Person {
   public Person(){
         PhoneNumbers = new HashSet<PhoneNumber>();
   }
   public int Id {get; set;}
   public String Name {get; set;}
   public virtual ICollection<PhoneNumber> PhoneNumbers { get; set; }
}
public class PhoneNumber {
    public int Id {get; set;}
    public String Number {get; set;}
    public int PersonId {get; set;}
}

尝试使用以下方法添加许多新PhoneNumbers的新Person时:

 Person person = new Person {Name = "Jimmy"};
 foreach(var phone in Phone_Number_In_Posted_Form){
     person.PhoneNumbers.Add(new PhoneNumber {Number = phone});
 }
 Db.Entity<Person>(person).State = EntityState.Added;
 Db.SaveChanges();

实体框架不会自动将生成的Id(自动增量(关联到PhoneNumbers(导航属性(,因此,SQL Server不能保存PhoneNumbers。尽管可以通过获取生成的Id并运行另一个循环以手动将其进行操作,但我想知道是否有任何可以更有效地工作的实体框架中的标准解决方案。

实体框架不会自动将生成的ID(自动增量(关联到PhoneNumbers(导航属性(,因此,SQL Server并未保存PhoneNumbers

原因是不同的。这是因为设置 State属性确实不是 cascade(dis 不是递归应用于相关数据(,因此不是替换相应的DbContext/DbSet方法的替代。

在您的情况下,而不是将State设置为Added,您应该调用Add方法:

Person person = new Person {Name = "Jimmy"};
foreach(var phone in Phone_Number_In_Posted_Form){
    person.PhoneNumbers.Add(new PhoneNumber {Number = phone});
}
Db.Add(person);
Db.SaveChanges();

最新更新