阻止EntityFramework将外键设置为null

时间:2016-06-13 16:18:04

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

我正在使用带有软删除实现的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)时,它可以工作。但这真的是每个人都需要的吗?有没有办法配置这种行为?

非常感谢!

0 个答案:

没有答案