我正在更新一个对象&然后通过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:Sequence不包含匹配元素。
(如果在没有更新的情况下读取readPerson11
,那么我会正确地返回person11
。)
我在更新后尝试了realm.Refresh()
&amp;在读人之前。
还尝试GetBacklinks<Person>(nameof(Person.Dogs))
但没有结果。
帮助将受到高度赞赏。
答案 0 :(得分:0)
原因是更新会覆盖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));
或者,您可以反转关系 - 而不是将一个狗列表分配给一个人和狗对象上的反向链接,您可以在Person
类上有一个Dog
属性,并且可以在反向链接上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; }
}
然后更新此人不会影响他们的狗收藏。