目前,我正在使用Xamarin表单中的NuGet SQLite-Net-Extensions,我遇到了一个无法找到解决方案的问题。
问题:当调用GetWithChildren(primaryKey,recursive: true)时,返回的对象只包含第一个子层。下面是一个例子。
数据库是这样构建的:

下面提供了此模型的等效代码:
用户
namespace DatabaseTest
{
[Table("Users")]
public class User
{
[PrimaryKey,AutoIncrement]
public int Id { get; set; }
public string Name { get; set; }
[OneToMany]
public List<Contact> Contacts { get; set; }
}
}联系方式
namespace DatabaseTest
{
[Table("Contacts")]
public class Contact
{
[PrimaryKey,AutoIncrement]
public int Id { get; set; }
public string Name { get; set; }
[OneToMany]
public List<Entry> Entries { get; set; }
[ForeignKey(typeof(User))]
public int UserID { get; set; }
[ManyToOne]
public User User { get; set; }
}
}条目
namespace DatabaseTest
{
[Table("Entries")]
public class Entry
{
[PrimaryKey,AutoIncrement]
public int Id { get; set; }
public float Amount { get; set; }
[ForeignKey(typeof(Contact))]
public int ContactId { get; set; }
[ManyToOne]
public Contact Contact { get; set; }
}
}在我的App.cs中,我正在创建数据库,并对所有三个类使用CreateTable()方法。就本例而言,在MainPage.xaml.cs中只有一个按钮,它有一个ButtonClicked方法。
在真实的应用程序中,流程可能如下所示:
User logs -> Adds Contact -->在某一时刻,用户创建他的一个联系人的条目
为了在我的示例中完成此过程,ButtonClicked方法如下所示:
void ButtonClicked(object sender, EventArgs e)
{
try
{
User user = new User()
{
Name = "Test user"
};
Contact contact = new Contact()
{
Name = "First contact"
};
Entry entry1 = new Entry()
{
Amount = 10F
};
Entry entry2 = new Entry()
{
Amount = 20F
};
App.Database.Insert(user);
if (user.Contacts==null)
{
user.Contacts = new List<Contact>();
}
App.Database.Insert(contact);
user.Contacts.Add(contact);
App.Database.UpdateWithChildren(user);
if (contact.Entries==null)
{
contact.Entries = new List<Entry>();
}
App.Database.Insert(entry1);
App.Database.Insert(entry2);
contact.Entries.Add(entry1);
contact.Entries.Add(entry2);
App.Database.UpdateWithChildren(contact);
App.Database.UpdateWithChildren(user);
var test = App.Database.GetWithChildren<User>(user.Id, recursive: true);
var test2 = App.Database.GetAllWithChildren<Contact>();
var test3 = App.Database.GetAllWithChildren<Entry>();
} catch (Exception ex)
{
Debug.Print(ex.Message);
}
}我已经在括号中设置了一个断点,用来结束尝试检查结果。最后,我的用户如下所示:

这绝对是完美的。
但是,当我尝试从我的数据库中获取此用户时,结果如下所示:

我不知道如何解决这个错误,希望任何人能帮助我解决这个问题。由于这篇文章已经很长了,我要感谢所有提前阅读了这篇文章的人。
发布于 2019-03-17 18:40:12
经过多次尝试,我终于自己解决了我的问题。

解决方案:
这再简单不过了。在我的User中,Contact和Entry类为我的OneToMany和ManyToOne属性提供了CascadeOperation属性。示例:
[OneToMany(CascadeOperations = CascadeOperation.All)]
public List<Entry> Entries { get; set; }
[ManyToOne(CascadeOperations = CascadeOperation.All)]
public User User { get; set; }尽管我将GetWithChildren()方法标记为recursive: true,但只有通过应用CascadeOperations,它才能正常工作。关于SQLite-Net-Extensions和CascadeOperations的更多信息可以在这里找到:
https://stackoverflow.com/questions/55200818
复制相似问题