我正在建立一个具有一对多关系的数据库,但是我只是无法让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中都正确设置了它们。