如何在Realm .NET中向现有的RealmObject模型对象添加用PrimaryKey注释的属性?

问题描述 投票:1回答:1

我正在使用Realm .NET在realm数据库中存储模型对象。我有一个现有的模型对象叫做 Employee 的单一属性。

public class Employee : RealmObject
{
    public string Username { get; set; }
}

Realm数据库中已经有几个这种类型的实例。

我现在试图向对象添加一个新的属性,该属性应以 [PrimaryKey] 属性。所需的新版本的对象应该是这样的。

public class Employee : RealmObject
{
    [PrimaryKey]
    public string Id { get; set; }

    public string Username { get; set; }
}

因为新的 Id 属性将不包含适合现有数据库对象的值,我试图使用Realm中的迁移功能为它们的值播种。执行Realm迁移的代码是这样的。

private void MigrateToSchemaVersionWithEmployeeIds(Migration migration)
{
    var employees = migration.NewRealm.All<Employee>();
    foreach (var employee in employees)
    {
        employee.Id = Guid.NewGuid().ToString();
    }
}

当启动应用程序时,迁移代码被执行,但是当分配到... Id 财产,一个 Exception 被抛出。

System.InvalidOperationException: Once set, primary key properties may not be modified.

作为一个变通的办法,我已经确定你可以先添加属性,而不需要使用... [PrimaryKey] 属性,在迁移代码中加入它的值(在这种情况下不会出现异常),停止应用,添加 [PrimaryKey] 属性,增加模式版本并重新启动应用程序。由于当应用程序已经部署在生产中时,这并不是可行的解决方案,因此我正在寻找一种方法来实现这一点,而不必使用这种变通方法。

如何将一个带有 [PrimaryKey] 属性可以添加到Realm .NET中现有的模型对象中吗?

c# .net realm
1个回答
0
投票

不幸的是,这是不可能的。作为一个变通办法,你可以将你的 Employee 类到一个新的表一样。

[MapTo("Employee2")]
public class Employee : RealmObject
{
    [PrimaryKey]
    public string Id { get; set; }

    public string Username { get; set; }
}

这将允许你继续使用它作为 Employee 的目的,但在数据库本身,它将被持久化为 Employee2. 然后在迁移块中,你可以这样做。

private void MigrateToSchemaVersionWithEmployeeIds(Migration migration)
{
    var employees = migration.OldRealm.All("Employee");
    foreach (var employee in employees)
    {
        var newEmployee = new Employee
        {
            Id = Guid.NewGuid().ToString(),
            Name = employee.Name
        };
        migration.NewRealm.Add(newEmployee);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.