我正在更新一个对象,然后通过Backlink
访问它。它还没有奏效。
class Person : RealmObject
{
[PrimaryKey]
public int Id { get; set; }
public string Name { get; set; }
public IList<Dog> Dogs { get; }
}
class Dog : RealmObject
{
[PrimaryKey]
public int Id { get; set; }
[Ignored]
public Person Person
{
get
{
if (_person == null)
_person = Persons.First();
return _person;
}
}
[Backlink(nameof(Person.Dogs))]
public IQueryable<Person> Persons { get; }
}
加:
var dog = new Dog () {Id = 1};
var person1 = new Person () {Id = 1, Name = "Person1"};
person1.Dogs.Add(dog);
realm.Write(() => realm.Add(person1));
更新:
var person11 = new Person() {Id = 1, Name = "Person11"};
realm.Write(() => realm.Add(person11, true));
读:
var readPerson11 = realm.All<Dog>.First().Person;
我在Person
属性上遇到异常。
未处理的异常:
System.InvalidOperationException: 序列包含未发生匹配元素。
(如果在不更新的情况下读取readPerson11
,那么我会正确取回person11
。
我在更新后和阅读Person之前尝试了realm.Refresh()
。也尝试了GetBacklinks<Person>(nameof(Person.Dogs))
没有结果。
帮助将不胜感激。
原因是更新会覆盖Person
对象的所有值。如果选中,更新后,person11.Dogs
将为空。因此,在更新时,您需要提供分配给此人的整个狗集合。一种方法是使用旧值:
var currentPerson11 = realm.Find<Person>(1);
var person11 = new Person() {Id = 1, Name = "Person11"};
foreach (var dog in currentPerson11.Dogs)
{
person11.Dogs.Add(dog);
}
realm.Write(() => realm.Add(person11, true));
或者,您可以反转关系 - 而不是将 Dogs 列表分配给一个人并在 dog 对象上具有反向链接,您可以在 Dog
类上有一个 Person
属性,在 Person
上有一个反向链接:
public class Person : RealmObject
{
// ... other props
[Backlink(nameof(Dog.Person))]
public IQueryable<Dog> Dogs { get; }
}
public class Dog : RealmObject
{
// ... other props
public Person Person { get; set; }
}
然后更新此人不会影响他们的狗收藏。