1

我们有一个测试用例,它在实体 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。但是,添加的对象集合不会类似地重置。

在底部添加行似乎可以解决问题。

这是正确的解决方法,还是我们遗漏了什么?

4

0 回答 0