【问题标题】:SQLite.Net Extensions - Delete Children on UpdateSQLite.Net 扩展 - 更新时删除子级
【发布时间】:2017-01-30 10:12:42
【问题描述】:

我有以下两个课程。 当我保存包含多个项目 (B) 的 A 时,我得到了预期的结果。 但是,当我保存对 A 的更改时,例如一个空的 Items(B) 列表,我希望表 B 中的所有元素都会自动被删除,因为它们没有在任何地方引用(不打算单独查询它们)。 相反,每个项目的外键 (IDofA) 在表中设置为 Null。 在我的情况下,这会导致表 (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);
    });
}

【问题讨论】:

    标签: c# sqlite-net sqlite-net-extensions


    【解决方案1】:

    更新元素永远不会导致删除设计的子对象。仅仅通过更新另一个表来执行破坏性操作并不是一个好主意。只需删除不再引用的元素即可解决您无限增长的表格问题:

    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');
        });
    }
    

    【讨论】:

    • 我希望有一个配置...无论如何,感谢简单的解决方案。
    猜你喜欢
    • 2013-02-19
    • 1970-01-01
    • 2014-09-02
    • 1970-01-01
    • 1970-01-01
    • 2019-04-16
    • 1970-01-01
    • 2013-01-31
    • 1970-01-01
    相关资源
    最近更新 更多