Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# EF:为什么不删除子记录_C#_Entity Framework_Entity Framework 6_Ef Code First_Code First - Fatal编程技术网

C# EF:为什么不删除子记录

C# EF:为什么不删除子记录,c#,entity-framework,entity-framework-6,ef-code-first,code-first,C#,Entity Framework,Entity Framework 6,Ef Code First,Code First,我的结构如下: public partial class Driver { public int ID { get; set; } //.... #region Vistracks Required Fields public virtual ProblemSyncToVistracksDriver ProblemSyncToVistracksDriver { get; set; } #endregion } public partial cl

我的结构如下:

public partial class Driver 
{
    public int ID { get; set; }
    //....

    #region Vistracks Required Fields

    public virtual ProblemSyncToVistracksDriver ProblemSyncToVistracksDriver { get; set; }

    #endregion
}


public partial class ProblemSyncToVistracksDriver
{
    [Key, ForeignKey("Driver")]
    public int DriverId { get; set; }
    public virtual Driver Driver { get; set; }

    public int? ResponseCode { get; set; }
    public string Message { get; set; }
    public string Description { get; set; }
    public bool IsServerError { get; set; }
    public DateTime DateAdded { get; set; }
}


modelBuilder.Entity<ProblemSyncToVistracksDriver>()
    .HasRequired(s => s.Driver)
    .WithOptional(ad => ad.ProblemSyncToVistracksDriver)
    .WillCascadeOnDelete(false);
然后,我尝试从ProblemSyncToVistracksDriver for concrete driver中删除一条记录:

        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中的记录未被删除。为什么以及如何修复它?

要删除子记录,首先需要从数据库中获取它,然后可以将其设置为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();

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

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

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

您可以在此处找到更多说明

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

modelBuilder.Entity<ProblemSyncToVistracksDriver>()
    .HasRequired(s => s.Driver)
    .WithOptional(ad => ad.ProblemSyncToVistracksDriver)
    .WillCascadeOnDelete(false);
此规范表明每个ProblemSyncToVistrackDriver对象只属于一个驱动程序,而不是零,不是两个:一个。可以在属性驱动程序中找到此驱动程序

您将在属性驱动程序中找到的驱动程序具有可选属性ProblemSyncToVistracksDriver。这意味着,如果该属性为null,实体框架可能会假定不存在属于该驱动程序的SyncToVisTrackDriver问题

你所做的是,你指定了一个适当的一对零或一关系。每个驱动程序都有零个或一个ProblemSyncToVistrackDriver,每个ProblemSyncToVistrackDriver只属于一个驱动程序

如果你有一个驱动程序,你会将它的ProblemSyncToVistrackDriver设置为零,那么你要说的是这个驱动程序已经没有ProblemSyncToVistrackDriver了。通常,CascadeOnDelete会注意删除此驱动程序的前ProblemSyncToVistrackDriver。您指定不希望自动删除,因此不会删除ProblemSyncToVistrackDriver。这就是为什么它没有被删除


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

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

modelBuilder.Entity<ProblemSyncToVistracksDriver>()
    .HasRequired(s => s.Driver)
    .WithOptional(ad => ad.ProblemSyncToVistracksDriver)
    .WillCascadeOnDelete(false);
此规范表明每个ProblemSyncToVistrackDriver对象只属于一个驱动程序,而不是零,不是两个:一个。可以在属性驱动程序中找到此驱动程序

您将在属性驱动程序中找到的驱动程序具有可选属性ProblemSyncToVistracksDriver。这意味着,如果该属性为null,实体框架可能会假定不存在属于该驱动程序的SyncToVisTrackDriver问题

你所做的是,你指定了一个适当的一对零或一关系。每个驱动程序都有零个或一个ProblemSyncToVistrackDriver,每个ProblemSyncToVistrackDriver只属于一个驱动程序

如果你有一个驱动程序,你会将它的ProblemSyncToVistrackDriver设置为零,那么你要说的是这个驱动程序已经没有ProblemSyncToVistrackDriver了。通常,CascadeOnDelete会注意删除此驱动程序的前ProblemSyncToVistrackDriver。您指定不希望自动删除,因此不会删除ProblemSyncToVistrackDriver。这就是为什么它没有被删除


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

将WillCascadeOnDelete设置为true@LucianBumb,无法将WillCascadeOnDelete设置为来自客户的真实需求。该设置负责删除子级的,如果您不能使用它,这意味着您需要在您的计算机中手动执行code@LucianBumb但是字符串driver.ProblemSyncToVistracksDriver=null;不意味着手动删除?将WillCascadeOnDelete设置为true@LucianBumb,无法将WillCascadeOnDelete设置为来自客户的真实要求。该设置负责删除子项,如果您无法使用它,则意味着您需要在您的系统中手动执行code@LucianBumb但是字符串driver.ProblemSyncToVistracksDriver=null;不意味着手动删除?