Расширения SQLite.Net — удаление дочерних элементов при обновлении

У меня есть следующие два класса. Когда я сохраняю A с несколькими элементами (B), я получаю ожидаемый результат. Но когда я сохраняю изменения в A, такие как пустой список элементов (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);
        });
    }

person Norman Schütt    schedule 30.01.2017    source источник


Ответы (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');
    });
}
person redent84    schedule 30.01.2017
comment
Я надеялся, что для этого есть конфигурация... В любом случае, спасибо за простое решение. - person Norman Schütt; 30.01.2017