SQLite.Net 扩展 - 更新时删除子项
SQLite.Net Extensions - Delete Children on Update
我有以下两个类。
当我在其中保存包含多个项目 (B) 的 A 时,我得到了预期的结果。
但是当我保存对 A 的更改时,例如一个空的项目列表 (B),我希望 table B 中的所有元素自动被删除,因为它们没有在任何地方被引用(无意单独查询它们)。
相反,每个项目的外键 (IDofA) 在 table 中都设置为 Null。
在我的例子中,这导致了无限增长 Table (B),因为 A 的一些对象从未被删除,只是被更新了。
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);
});
}
根据设计,更新元素永远不会导致删除子对象。仅通过更新另一个来对 table 执行破坏性操作不是一个好主意。您不断增长的 table 问题可以通过删除不再引用的元素来解决:
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');
});
}
我有以下两个类。 当我在其中保存包含多个项目 (B) 的 A 时,我得到了预期的结果。 但是当我保存对 A 的更改时,例如一个空的项目列表 (B),我希望 table B 中的所有元素自动被删除,因为它们没有在任何地方被引用(无意单独查询它们)。 相反,每个项目的外键 (IDofA) 在 table 中都设置为 Null。 在我的例子中,这导致了无限增长 Table (B),因为 A 的一些对象从未被删除,只是被更新了。
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);
});
}
根据设计,更新元素永远不会导致删除子对象。仅通过更新另一个来对 table 执行破坏性操作不是一个好主意。您不断增长的 table 问题可以通过删除不再引用的元素来解决:
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');
});
}