Как сохранить вложенные объекты области в базу данных? - PullRequest
0 голосов
/ 04 июня 2019

Я настраиваю базу данных с некоторыми отношениями 1-ко-многим, но я просто не могу заставить Realm сохранить вложенные списки в базе данных. Все атрибуты с одним значением сохраняются отлично, но не коллекции.

Я уже искал SO и другие сайты. В этом посте , похоже, та же проблема, но данное решение не решило мою проблему. Я также попробовал альтернативный метод записи, используя

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

Это была моя первая попытка сохранить Книгу в Царстве (думаю, вы можете игнорировать все, что касается идентификаторов, но я все равно хотел включить ее, чтобы вы ничего не пропустили):

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

Это моя текущая функция, в которой я пытаюсь добавить все вручную, чтобы, надеюсь, предотвратить любые помехи-шениганы:

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 сохраняются очень хорошо, в то время как BookTags, EntryTags и Entries теряются во время процесса записи. Я уже проверил значения книги, но все они, кажется, установлены правильно внутри блока записи в обеих версиях функции AddBook.

...