【问题标题】:Updated RealmObject when read via Backlink is null通过 Backlink 读取时更新的 RealmObject 为 null
【发布时间】:2017-11-09 07:25:17
【问题描述】:

我正在更新一个对象,然后通过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&lt;Person&gt;(nameof(Person.Dogs)),但没有结果。

我们将不胜感激。

【问题讨论】:

    标签: c# xamarin realm


    【解决方案1】:

    原因是更新覆盖了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; }
    }
    

    那么更新此人不会影响他们的 Dogs 收藏。

    【讨论】:

      猜你喜欢
      • 2014-11-19
      • 2018-09-13
      • 1970-01-01
      • 2022-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-29
      • 1970-01-01
      相关资源
      最近更新 更多