Я настраиваю базу данных с некоторыми отношениями 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.