我正在使用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中现有的模型对象中吗?
不幸的是,这是不可能的。作为一个变通办法,你可以将你的 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);
}
}