【问题标题】:SQLite-Net Extensions how to correctly update object recursivelySQLite-Net Extensions 如何正确递归更新对象
【发布时间】:2015-03-17 07:46:50
【问题描述】:

我正在使用 SQLite-Net PCL 和 SQLite-Net 扩展来开发使用 Xamarin 的应用程序。

我在两个类AB 之间有一对多的关系,定义如下:

   public class A
{

    [PrimaryKey, AutoIncrement]
    public int Id
    {
        get;
        set;
    }

    public string Name
    {
        get;
        set;
    }

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

    public A()
    {
    }

    public A(string name, List<B> sons)
    {
        Name = name;
        Sons = sons;
    }

}

public class B
{

    [PrimaryKey, AutoIncrement]
    public int Id
    {
        get;
        set;
    }

    public string Name
    {
        get;
        set;
    }

    [ForeignKey(typeof(A))]
    public int FatherId
    {
        get;
        set;
    }

    [ManyToOne]
    public A Father
    {
        get;
        set;
    }

    public B()
    {
    }

    public B(string name)
    {
        Name = name;
    }

}

我想做的是从数据库中检索A 类型的对象,删除B 类型的Sons 对象之一并相应地更新数据库。这是我尝试过的:

        var sons = new List<B>
        {
            new B("uno"),
            new B("due"),
            new B("tre"),
        };

        one = new A("padre", sons);

        using (var conn = DatabaseStore.GetConnection())
        {
            conn.DeleteAll<A>();
            conn.DeleteAll<B>();

            conn.InsertWithChildren(one, true);

            A retrieved = conn.GetWithChildren<A>(one.Id);
            retrieved.Sons.RemoveAt(1);
        }

        using (var conn = DatabaseStore.GetConnection())
        {
            var retrieved = conn.GetWithChildren<A>(one.Id);
            retrieved.Sons.RemoveAt(1); //"due"

            //conn.UpdateWithChildren(retrieved);
            conn.InsertOrReplaceWithChildren(retrieved, true);
        }

问题在于UpdateWithChildrenInsertOrReplaceWithChildren 的对象都没有真正从数据库中删除,而只是外键为空。是否可以让它删除son对象?

【问题讨论】:

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


    【解决方案1】:

    您根本没有真正尝试删除任何对象。您只是删除了两个对象之间的关系,但没有什么能阻止您拥有与其中任何一个相关的更多对象,因此删除任何对象都是不正确的,因为您可能会破坏其他关系。

    应该更像这样:

    using (var conn = DatabaseStore.GetConnection())
    {
        var retrieved = conn.GetWithChildren<A>(one.Id);
        var due = retrieved.Sons[1];
    
        // This is not required if the foreign key is in the other end,
        // but it would be the usual way for any other scenario
        // retrieved.Sons.Remove(due);
        // conn.UpdateWithChildren(retrieved);
    
        // Then delete the object if it's no longer required to exist in the database
        conn.delete(due);
    }
    

    【讨论】:

    • 这完全有道理。虽然我认为当对象的所有外键都可以为空时,可能会删除该对象,但可能需要为所考虑的对象明确指定这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-29
    • 1970-01-01
    • 2017-07-07
    • 1970-01-01
    • 1970-01-01
    • 2023-01-19
    相关资源
    最近更新 更多