1

所以我处于需要迁移数据库中的一个模型的情况。我在模型中添加了一个DateTimeOffset字段,该字段将包含我的Recommendation模型当前在数据库中不存在的日期。因此无法从现有数据中填充新字段。

Recommendation在我的迁移回调中,我想要模型及其所有子模型(它由几个类组成)的空白板。因此,我可以使用新字段从我的 web-api 获取新的推荐数据集。当我尝试清除所有现有模型数据的旧数据库时,出现异常。

Realms.Exceptions.RealmInvalidTransactionException

无法在只读领域执行事务。

我如何实现上述目标?

这是我的迁移回调的相关代码。

        var config = new RealmConfiguration("salt.realm");
        config.SchemaVersion = 2;
        config.MigrationCallback = (migration, oldSchemaVersion) =>
        {
            Settings.UpdateDateRecommendationsUtc = DateTime.MinValue;

            migration.OldRealm.Write(() => 
            { 
                migration.OldRealm.RemoveAll("RecDataString");
                migration.OldRealm.RemoveAll("RecChart");
                migration.OldRealm.RemoveAll("RecSummary");
                migration.OldRealm.RemoveAll("RecTickerSymbol");
                migration.OldRealm.RemoveAll("Recommendation");
            });
        };
4

2 回答 2

0

由于您不希望RealmObject在迁移过程中保留这五个的任何数据RemoveAllNewRealm因此数据将已经在 NewRealm 中可用,添加属性的默认值或已删除属性的缺失属性。

OldRealm如果您需要访问“旧”属性并对其执行某种类型的数据转换并使用它更新,则仅在迁移期间需要数据NewRealm...

migration.NewRealm.RemoveAll<POCO>();
await UpdateRecommendationFromYourWebApi();

注意:由于您要添加DateTimeOffset,因此您可能需要注意当前的错误,该错误将默认值设置为 "1/1/1970 12:00:00 AM +00:00" 与 "1/1/0001上午 12:00:00 +00:00"

回复:https ://github.com/realm/realm-dotnet/issues/1225

于 2017-02-17T15:41:08.543 回答
0

因此,正如@SushiHangover 正确指出的那样,我应该在 newRealm 而不是 oldRealm 上进行操作。因为我担心删除新领域的领域对象。不需要写事务,因为config.MigrationCallback本身已经是写事务。我无法开始RemoveAll("className")工作它会引发异常,这是我目前拥有的工作解决方案。

        var config = new RealmConfiguration("salt.realm");
        config.SchemaVersion = 1;
        config.MigrationCallback = (migration, oldSchemaVersion) =>
        {
            Settings.UpdateDateRecommendationsUtc = DateTime.MinValue;

            migration.NewRealm.RemoveAll<Recommendation>();
            migration.NewRealm.RemoveAll<RecDataString>();
            migration.NewRealm.RemoveAll<RecChart>();
            migration.NewRealm.RemoveAll<RecSummary>();
            migration.NewRealm.RemoveAll<RecTickerSymbol>();
        };
于 2017-02-17T15:59:49.557 回答