建立一个1:0..1的关系,使引用自动删除引用的对象?

问题描述:

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

一个例子:

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

然而,这并不工作:(

+0

这是数据库第一或代码第一? –

+0

先编码,流利配置 –

+0

'dbContext.StudentDetails.Remove(student.Details);''''''''据我所知,当您将一个实体设置为null时,什么也不做。 –

的关系设置是正确的,应该产生期望的行为(我建议,为了增加WillCascadeOnDelete()允许级联删除其通过默认关闭一对一关系,但不影响有问题的行为)

但是,必须加载Details属性之后才能将其设置为null以便通过上下文检测为更改在期间更改跟踪器并从数据库中删除电话。

您可以通过多种方式来实现。例如,实体检索过程中急于加载:

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

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