EF:为什么不删除子记录

时间:2018-02-15 19:13:01

标签: c# entity-framework entity-framework-6 ef-code-first code-first

我有以下结构:

        var driver = await (from i in _db.Drivers where i.AspNetUser.UserName.Equals(model.Email, StringComparison.InvariantCultureIgnoreCase) select i).FirstOrDefaultAsync();
        if (driver == null)
            throw new NullReferenceException();

        driver = mapper.Map<VistrackDriverInfoDomain, Infrastructure.Asset.Driver>(model, driver);
        driver.IsVistracksAdded = true;
        driver.VistracksDateSync = DateTime.Now;
        driver.ProblemSyncToVistracksDriver = null;

        _db.Entry(driver).State = EntityState.Modified;
        await _db.SaveChangesAsync();

然后我尝试从ProblemSyncToVistracksDriver中删除具体驱动程序的记录:

cidr_blocks = ["1.2.3.4/32","5.6.7.8/32"]

没有错误,保存所有其他更改。但是不会删除ProblemSyncToVistracksDriver中的记录。为什么以及如何解决它?

2 个答案:

答案 0 :(得分:1)

要删除子记录,首先需要从数据库中获取它,然后将其设置为null:

var driver=_db.Drivers.Include(x=>x.ProblemSyncToVistracksDrivers)
.FirstOrDefaultAsync(x=>x.AspNetUser.UserName.Equals(model.Email, StringComparison.InvariantCultureIgnoreCase));
driver.ProblemSyncToVistracksDriver = null;
 await _db.SaveChangesAsync();

您可以在此处找到更多解释similar question

答案 1 :(得分:1)

在您的模型中,您指定了:

modelBuilder.Entity<ProblemSyncToVistracksDriver>()
    .HasRequired(s => s.Driver)
    .WithOptional(ad => ad.ProblemSyncToVistracksDriver)
    .WillCascadeOnDelete(false);

此规范表明每个ProblemSyncToVistrackDriver对象只属于一个Driver,而不是零,而不是两个:恰好一个。此驱动程序可在属性Driver中找到。

您将在属性Driver中找到的驱动程序具有可选属性ProblemSyncToVistracksDriver。这意味着,如果该属性为null,则实体框架可能会假定没有ProblemSyncToVistrackDriver属于此Driver

你做了什么,是你指定了一个合适的一对一矿石关系。每个Driver都有零个或一个ProblemSyncToVistrackDriver,每个ProblemSyncToVistrackDriver只属于一个Driver

如果你有一个Driver,并且你将其ProblemSyncToVistrackDriver设置为零,那么你所说的是Driver已经没有ProblemSyncToVistrackDriver了。通常情况下,CascadeOnDelete会注意删除此ProblemSyncToVistrackDriver的前Driver。您指定不希望自动删除,因此不会删除ProblemSyncToVistrackDriver。这就是它不被删除的原因。

如果您指定要手动删除,则必须自行删除该项目。