通过反向链接读取时更新的 RealmObject 为空



我正在更新一个对象,然后通过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; }
}

然后更新此人不会影响他们的狗收藏。

最新更新