我正在使用带有软删除实现的EF6,因此我不希望EF级联删除或将外键设置为null。我们需要在数据库中记录关系。
通过删除这样的模型构建器约定,我能够阻止EF6创建级联删除外键:
modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();
modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
但是,EF6仍然将外键设置为null。 这是一个很小的例子:
public class BaseEntity
{
public int Id { get; set; }
public DateTime? DeletedOn { get; set; }
}
public class Project : BaseEntity
{
public string Name { get; set; }
public virtual ICollection<Task> Tasks { get; set; }
}
public class Task : BaseEntity
{
public string Name { get; set; }
public int? ProjectId { get; set; }
[ForeignKey("ProjectId")]
public virtual Project Project { get; set; }
}
当我从数据库加载项目及其相关任务,然后删除项目时,任务的ProjectIds被设置为null。
using (var context = new TestModelContext())
{
var project = context.Projects.FirstOrDefault(c => c.DeletedOn.HasValue == false);
var tasks = project.Tasks.ToList();
context.Projects.Remove(project);
context.SaveChanges();
}
我已经获得了EF6的源代码,并发现在EntityEntry Delete函数的第2579行中,它似乎是硬编码的,因为EF使所有外键都空。当我删除三行(2579-2581)时,它可以工作。但这真的是每个人都需要的吗?有没有办法配置这种行为?
非常感谢!