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
                }

delete ステートメントが実行された後、削除されたオブジェクト コレクションは null に設定されることに注意してください。ただし、追加されたオブジェクト コレクションは同様にリセットされません。

一番下に行を追加すると、問題が解決するようです。

これは正しい修正ですか、それとも何か不足していますか?

4

0 に答える 0