Сохраняет ли Entity Framework связанные классы автоматически?

предположим, что у нас есть такие классы

public class A{
    string someField { get; set; }
    public virtual B B {get; set; }
}

public class B {
   int someIntField {get; set; }

   [ForeignKey("Id")]
   [Required]
   public virtual A A { get; set; } 
}

в коде я создаю новые экземпляры для обоих из них и создаю отношение типа:

A a = new A () { someField = "abcd"};
B b = new B () { someIntField = 42 };

A.B = b;
B.A = a;

должен ли я использовать DBContext для сохранения обоих классов:

using (var db = new myDbContext()) {
    myDbContext.As.Add(A);
    myDbContext.Bs.Add(B);
    myDBContext.SaveChanges();
}

или сохранить его так:

using (var db = new myDbContext()) {
    myDbContext.As.Add(A);
    myDbContext.SaveChanges();
}

достаточно ли хранить связанные объекты в базе данных?

3 ответов


из вашего примера, если вы создаете экземпляр новых объектов сущности, а затем назначаете дочерний объект свойству родительского объекта, то EF фактически создаст новый дочерний экземпляр (запись) и сопоставит его с родительским в качестве ссылки.

ваш фрагмент кода немного запутан, потому что у вас есть ссылка от A до B и B до A, но рассмотрите следующее:

Если у вас было 2 сущности:

public class A
{
    public int Id;
}

public class B
{
    public int Id;
    public A A;
}

и при сохранении вы сделали что-то вроде это:

A a = new A();
B  b = new B();
b.A = a;
dbcontext.SaveChanges();

затем EF создаст новую запись для A, новую запись для B и добавит ссылку на вновь созданную запись в B.

посмотреть этой пост для получения дополнительной информации


достаточно сохранить объект, содержащий другой объект. Он также автоматически сохранит изменения в содержащихся объектах.

вы можете просто создать небольшой пример и посмотреть сами, что работает.


using (var db = new myDbContext()) {
   myDbContext.As.Add(A);
   myDbContext.SaveChanges();
}

этого должно быть достаточно.