首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQLite-Net-Extensions GetWithChildren()方法仅到达第一个子层

SQLite-Net-Extensions GetWithChildren()方法仅到达第一个子层
EN

Stack Overflow用户
提问于 2019-03-17 03:45:59
回答 1查看 1.2K关注 0票数 1

目前,我正在使用Xamarin表单中的NuGet SQLite-Net-Extensions,我遇到了一个无法找到解决方案的问题。

问题:当调用GetWithChildren(primaryKey,recursive: true)时,返回的对象只包含第一个子层。下面是一个例子。

数据库是这样构建的:

下面提供了此模型的等效代码:

用户

代码语言:javascript
复制
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; }
}
}

联系方式

代码语言:javascript
复制
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; }
}
}

条目

代码语言:javascript
复制
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方法如下所示:

代码语言:javascript
复制
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);
        }
    }

我已经在括号中设置了一个断点,用来结束尝试检查结果。最后,我的用户如下所示:

这绝对是完美的。

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

我不知道如何解决这个错误,希望任何人能帮助我解决这个问题。由于这篇文章已经很长了,我要感谢所有提前阅读了这篇文章的人。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-17 18:40:12

经过多次尝试,我终于自己解决了我的问题。

解决方案:

这再简单不过了。在我的User中,Contact和Entry类为我的OneToMany和ManyToOne属性提供了CascadeOperation属性。示例:

代码语言:javascript
复制
[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的更多信息可以在这里找到:

Source: TwinCoders SQLite-Net-Extensions

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55200818

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档