设置1:0..1关系,以便使引用归零会自动删除引用的对象?

时间:2017-09-20 06:42:35

标签: c# entity-framework entity-framework-6

如何设置与EF 6.x的1 : 0..1关系,以便将navigation属性设置为null也会自动删除引用的对象?

一个例子:

Student may have 0..1 StudentDetails

var student = new Student();
student.Details = new StudentDetails();
dbContext.Students.Add(student);
...
student.Details = null;
dbContext.SaveChanges(); // should automatically delete the StudentDetails object

如何正确设置关系?我目前的尝试是:

modelBuilder.Entity<Student>()
      .HasOptional(x => x.Details)
      .WithRequired();

但是,这不起作用:(

1 个答案:

答案 0 :(得分:2)

关系设置是正确的并且应该产生所需的行为(我建议添加WillCascadeOnDelete()以允许级联删除,默认情况下是一对一的关系,但不是影响有问题的行为。)

但是,必须先加载Details属性,然后才能将其设置为null,以便在SaveChanges()调用期间被上下文更改跟踪器检测为更改并从数据库中删除。 / p>

您可以通过多种方式实现这一目标。例如,在实体检索期间急切加载它:

var student = dbContext.Students
    .Include(s => s.Details) // <--
    .FirstOrDefault(s => s.Id == ...);
通过访问

或延迟加载(如果启用了延迟加载):

var details = student.Details;

或明确加载,以防您不知道如何检索它并禁用延迟加载:

dbContext.Entry(student).Reference(s => s.Details).Load();

一旦你这样做,有问题的代码

student.Details = null;
dbContext.SaveChanges();

将从数据库中删除现有的详细信息记录。