2017-01-30 10 views
0

私は次の2つのクラスを持っています。 複数のアイテム(B)を含むAを保存すると、予期した結果が得られます。 しかし、空のList of Items(B)のような変更をAに保存すると、テーブルBのすべての要素がどこからでも参照されないため自動的に削除されることが予想されます。 代わりに、テーブル内の各項目の外部キー(IDofA)がNullに設定されています。 私の場合、Aのオブジェクトの一部が決して削除されず、更新されたため、これは無限に成長するテーブル(B)につながります。SQLite.Net拡張 - 更新時に子供を削除

public class A 
{ 
    public string Name{ get; set; } 

    [OneToMany(CascadeOperations = CascadeOperation.All)] 
    public List<B> Items { get; set; } 
} 

public class B 
{ 
    [ForeignKey(typeof(A))] 
    public string IDofA { get; set; } 
} 


//This is the Generic Save Method that I use for all the Objects 
public virtual void Save(T element) 
    { 
     CreateID(element); 
     if (!RuntimeCache.Any(x => x.ID == element.ID)) 
     { 
      RuntimeCache.Add(element); 
     } 

     element.UpdateChangeDate(); 

     RunDBQueryAsync((conn) => 
     { 
      conn.InsertOrReplaceWithChildren(element); 
     }); 
    } 

答えて

0

要素を更新すると、設計によって子オブジェクトが削除されることはありません。別のテーブルを更新するだけでテーブルの破壊的な操作を行うのは良い考えではありません。あなたの無限の成長テーブルの問題だけでもう参照されていない要素を削除することによって解決することができます:

public virtual void Save(T element) 
{ 
    CreateID(element); 
    if (!RuntimeCache.Any(x => x.ID == element.ID)) 
    { 
     RuntimeCache.Add(element); 
    } 

    element.UpdateChangeDate(); 

    RunDBQueryAsync((conn) => 
    { 
     conn.InsertOrReplaceWithChildren(element); 
     // Delete orphaned children 
     conn.Execute("DELETE FROM B WHERE IDofA IS NULL'); 
    }); 
} 
+0

私はそのための設定があることを期待していた... とにかく、簡単な解決策のための感謝を。 –

関連する問題