这对我来说很奇怪,实际上是通过从导航属性(集合)中删除实体并将实体重新添加到相同的导航属性(集合中)来删除并重新建立关系(反之亦然)。因此,这里的关系应该没有任何变化。
someEntity.SomeSubEntities.Add(someSubEntity);
//at some later time (such as when cancelling)
someEntity.SomeSubEntities.Remove(someSubEntity);
//or vice-versa
someEntity.SomeSubEntities.Remove(someSubEntity);
//at some later time (such as when cancelling)
someEntity.SomeSubEntities.Add(someSubEntity);
实际上,通过尝试在SaveChanges
之前更改关系,结果是空的,像这样:
//try getting relationship change
var oc = (dbContext as IObjectContextAdapter).ObjectContext;
//this contains empty result
var changes = oc.ObjectStateManager
.GetObjectStateEntries(EntityState.Modified | EntityState.Added
| EntityState.Deleted)
.Where(e => e.IsRelationship);
//but exception is still thrown here
dbContext.SaveChanges();
即使关系发生了空洞的更改,仍会在SaveChanges
处引发以下异常:
'操作失败:由于一个或多个外键属性不可为空,因此无法更改关系。对关系进行更改时,相关的外键属性将设置为空值。如果外键不支持空值,则必须定义新的关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象。'
因此,很难理解此错误。我不确定这是否是SQLite EF中的某些错误。 EF to SQLite遇到了一些奇怪的事情,我认为EF to SQL Server并非如此。
那怎么会仍然发生错误呢?我可以尝试做哪些事情来进一步调试/诊断?我真的没有办法解决这个问题。
奇怪的是,如果应该建立/删除某些实际关系(仅通过添加/删除子实体),则用于更改关系的代码仍然无法正常工作(总是返回空结果)。至于开头的代码,我们没有取消这样的操作,而不是取消添加/删除:
someEntity.SomeSubEntities.Add(someSubEntity);
//or just this
someEntity.SomeSubEntities.Remove(someSubEntity);
,但是下面的代码仍然返回空结果:
var changes = oc.ObjectStateManager
.GetObjectStateEntries(EntityState.Modified | EntityState.Added
| EntityState.Deleted)
.Where(e => e.IsRelationship);
我不太确定这是怎么回事。因此,对于原始问题,可能已经建立了一些实际的关系,但是实现该更改的代码无法正常工作。因此,首先,我们需要先运行该代码,然后再深入研究原始问题。