与关系更改(从EF到SQLite)相关的引发InvalidOperationException吗?

时间:2018-07-02 08:17:25

标签: c# entity-framework sqlite

这对我来说很奇怪,实际上是通过从导航属性(集合)中删除实体并将实体重新添加到相同的导航属性(集合中)来删除并重新建立关系(反之亦然)。因此,这里的关系应该没有任何变化。

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);

我不太确定这是怎么回事。因此,对于原始问题,可能已经建立了一些实际的关系,但是实现该更改的代码无法正常工作。因此,首先,我们需要先运行该代码,然后再深入研究原始问题。

0 个答案:

没有答案