如何将嵌套的领域对象持久保存到数据库中?

时间:2019-06-04 09:35:53

标签: c# .net xamarin.forms realm realm-mobile-platform

我正在建立一个具有一对多关系的数据库,但是我只是无法让Realm将嵌套列表持久保存到数据库中。所有的单值属性都可以完美保存,但不能完全保存。

我已经搜索过SO和其他网站。 This post似乎有相同的问题,但是给定的解决方案无法解决我的问题。我还尝试了使用

的替代Write方法
using (var trans = realm.BeginWrite()) {
    //...
    trans.commit()
}

语法,但无济于事。

这是我的领域模型:

    public class Book : RealmObject
    {
        public Book()
        {
            BookTags = new List<string>();
            EntryTags = new HashSet<string>();
            Entries = new List<Entry>();
        }

        [PrimaryKey, Indexed]
        public int Id { get; set; }
        public int ParentId { get; set; }
        [Indexed]
        public string Title { get; set; }
        public string Author { get; set; }
        public IList<string> BookTags { get; }
        public ISet<string> EntryTags { get; }
        public IList<Entry> Entries { get; }
    }

    public class Entry : RealmObject
    {
        public Entry()
        {
            Tags = new List<Tag>();
        }

        [PrimaryKey, Indexed]
        public string Name { get; set; }
        [Backlink(nameof(Book.Entries))]
        public IQueryable<Book> Guide { get; }
        public string ImagePath { get; set; }
        public IList<Tag> Tags { get; }
    }

    public class Tag : RealmObject
    {
        [PrimaryKey, Indexed]
        public string Name { get; set; }
        public string Value { get; set; }
    }

这是我第一次尝试将Book存入领域(我认为您可以忽略所有与ID有关的内容,但无论如何我都希望包含它,这样您就不会错过任何内容):

public void AddBook(Book newBook, int parentId)
        {
            //set ID for new book
            var temp = LocalRealm.All<IdManager>().SingleOrDefault();
            IdManager idManager = temp == null ? new IdManager() : (IdManager)temp;
            newBook.Id = idManager.NextId;
            newBook.ParentId = parentId;

            LocalRealm.Write(() =>
            {
                var book = newBook;
                LocalRealm.Add(book);
                idManager.Inc();
                LocalRealm.Add(idManager, update: true);
            });
        }

这是我当前的功能,我尝试在其中手动添加所有内容,以期防止出现任何指针-shenanigans:

public void AddBook(Book newBook, int parentId)
        {
            //set ID for new book
            var temp = LocalRealm.All<IdManager>().SingleOrDefault();
            IdManager idManager = temp == null ? new IdManager() : (IdManager)temp;
            newBook.Id = idManager.NextId;
            newBook.ParentId = parentId;

            LocalRealm.Write(() =>
            {
                var book = new Book();
                book.Title = newBook.Title;
                book.Author = newBook.Author;
                book.Id = newBook.Id;
                book.ParentId = newBook.ParentId;

                foreach (string s in newBook.BookTags)
                    book.BookTags.Add(s);
                foreach (string s in newBook.EntryTags)
                    book.EntryTags.Add(s);
                foreach (Entry e in newBook.Entries)
                    book.Entries.Add(e);

                LocalRealm.Add(book);
                idManager.Inc();
                LocalRealm.Add(idManager, update: true);
            });
        }

正如我所说:Id,ParentId,Title和Author可以很好地保留,而BookTag,EntryTag和Entry在写入过程中会丢失。我已经检查了book的值,但是似乎在两个版本的AddBook函数中的Write-block中都正确设置了它们。

0 个答案:

没有答案