我有以下结构:
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中的记录。为什么以及如何解决它?
答案 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
。这就是它不被删除的原因。
如果您指定要手动删除,则必须自行删除该项目。