如何设置与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();
但是,这不起作用:(
答案 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();
将从数据库中删除现有的详细信息记录。