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;不意味着手动删除?