c# - SQLite-Net Extensions如何正确地递归更新对象

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

我正在使用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的对象,删除类型为SonsB对象之一,并相应地更新数据库。这是我尝试过的:

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


问题在于,无论是使用UpdateWithChildren还是使用InsertOrReplaceWithChildren,该对象都不会真正从数据库中删除,而只是将其外键置为空。是否可以删除son对象?

最佳答案

您实际上并没有尝试删除任何对象。您只是删除了两个对象之间的关系,但是没有什么可以阻止您拥有更多与它们相关的对象,因此删除任何对象都是不正确的,因为您可能会破坏其他关系。

应该更像这样:

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

关于c# - SQLite-Net Extensions如何正确地递归更新对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29093741/

相关文章:

c# - 需要从 Xamarin 中的选取器中选择至少一项

c# - XML 命名空间数据元素访问返回 null

c# - 在接口(interface)中定义可选的实现方法?

c# - 超链接、按钮以及打开新浏览器窗口的任何内容的列表

c# - UWP C# 中的 SQLite 备份

java - 检查时间戳(毫)是否属于特定日期

java - 有什么好的安卓开发ORM工具吗?

ios - Visual Studio 中没有 iphone 设备

c# - 使用没有依赖服务的 xamarin.forms 将图像大小压缩到 250kb

c# - 我如何在 C# 中使用 bouncycaSTLe 将 pem 公钥转换为 rsa 公钥?