通过Backlink读取时更新的RealmObject为null

时间:2017-11-09 07:25:18

标签: c# xamarin realm

我正在更新一个对象&然后通过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))但没有结果。

帮助将受到高度赞赏。

1 个答案:

答案 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; }
}

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