エンティティ 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 に設定されることに注意してください。ただし、追加されたオブジェクト コレクションは同様にリセットされません。
一番下に行を追加すると、問題が解決するようです。
これは正しい修正ですか、それとも何か不足していますか?