实体框架是否自动保存相关类

本文关键字:保存 框架 是否 实体 | 更新日期: 2023-09-27 18:36:46

假设我们有这样的类

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();
}

是否足以将相关对象存储到数据库中?

实体框架是否自动保存相关类

在您的示例中,如果实例化新的实体对象,然后将子对象分配给父对象的属性,则 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 创建新记录,并将新创建的 A 记录的引用添加到 B。

有关更多详细信息,请参阅此帖子

保存包含另一个对象的对象就足够了。它也将自动保留对所包含对象的更改。

你可以创建一个小例子,看看什么有效。

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

这应该足够了。