gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 18:50:09 27 4
gpt4 key购买 nike

我正在使用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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com