我们有一个测试用例,它在实体 X 和 Y 之间创建多对多关系,然后删除相同的关系。
SQLite 抛出关系存在的约束冲突。经过一番挖掘,我们发现关系表中还有一个关系表项。
看来这可能是 Vici CoolStorage 本身的一个错误。处理删除和添加对象的代码如下所示(在 CSListGeneric.cs 中):
if (Relation != null && Relation.PureManyToMany)
{
if (_removedObjects != null)
{
foreach (TObjectType obj in _removedObjects)
{
CSParameterCollection parameters = new CSParameterCollection();
parameters.Add("@LocalKey").Value = RelationObject.Data["#" + Relation.LocalKey].Value;
parameters.Add("@ForeignKey").Value = obj.Data["#" + Relation.ForeignKey].Value;
string deleteSql = DB.BuildDeleteSQL(Relation.LinkTable, null, DB.QuoteField(Relation.LocalLinkKey) + "=@LocalKey and " + DB.QuoteField(Relation.ForeignLinkKey) + "=@ForeignKey");
DB.ExecuteNonQuery(deleteSql, parameters);
}
_removedObjects = null;
}
if (_addedObjects != null)
{
foreach (TObjectType obj in _addedObjects)
{
CSParameterCollection parameters = new CSParameterCollection();
parameters.Add("@LocalKey").Value = RelationObject.Data["#" + Relation.LocalKey].Value;
parameters.Add("@ForeignKey").Value = obj.Data["#" + Relation.ForeignKey].Value;
DB.ExecuteInsert(Relation.LinkTable,
new[] { Relation.LocalLinkKey, Relation.ForeignLinkKey },
new[] { "@LocalKey", "@ForeignKey" },
null, null, null, parameters);
}
_addedObjects = null; // THIS WAS ADDED TO FIX THE BUG
}
请注意,在执行删除语句后,已删除对象集合设置为 null。但是,添加的对象集合不会类似地重置。
在底部添加行似乎可以解决问题。
这是正确的解决方法,还是我们遗漏了什么?