2

db4o ドキュメント(.net バージョン) で読んだように、クラスのフィールドの名前を変更するには、コードに次のコードを追加する必要があると思いました (もちろん、クラスの実際のフィールドの名前を変更します)。

IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
configuration.Common.ObjectClass("Namespace.ClassName, AssemblyName").
   ObjectField("fieldname").Rename("newfieldname");

そして、このコードをそのままにしておきます。しかし、これをテストしたところ、うまくいきませんでした (データベース内のオブジェクトは、名前が変更されたフィールドをロードしません)。うまくいったのは、このページの指示に従うことでした。

  1. 名前の変更を構成する
  2. 1で作成した設定でデータベースを開く
  3. データベースを閉じる
  4. コード内のフィールド名を変更する
  5. データベースを再度開くときは、名前の変更を構成しないでください。

これは私には少し奇妙に思えます。私のプログラムは、名前変更呼び出しだけで 1 回実行する必要があり、名前変更呼び出しなしで実際のフィールドの名前を変更して実行する必要があります。問題は、たった 1 つのステップで効果的な名前変更を行う方法があるかどうかです。

たとえば、組み込み (モバイル) アプリケーションを更新するプロセスでは、新しいバージョン (リファクタリング) をクライアントにインストールする前に、名前変更呼び出しを 1 回実行する必要があります。それを回避する方法はありますか?何か不足していますか、または db4o データベース内のフィールドの名前を変更する他の方法はありますか?

4

1 に答える 1

1

また、構成の名前を変更することもできませんでしたが、次の方法でうまく機能することがわかりました。

static void RenameFields() {
    using (IObjectContainer db = Db4oEmbedded.OpenFile("mydb.db4o")) {
        db.Ext().StoredClass(typeof(MyType)).GetStoredFields().Single(f => f.GetName() == "<ID>k__BackingField").Rename("<Id>k__BackingField");
    }
}

MyType保存されているすべてのクラスとフィールド名を一覧表示する以下の関数で指定されているように、完全修飾クラス名を使用して指定することもできます。autoプロパティによって生成されたプライベートフィールドは<PropertyName>k__BackingField、たとえば<Id>k__BackingField、という名前のプロパティの形式であることに気付くでしょうId

static void ShowClassNamesAndFields() {
    using (IObjectContainer db = Db4oEmbedded.OpenFile("mydb.db4o")) {
        var dbClasses = db.Ext().StoredClasses();
        foreach (var dbClass in dbClasses) {
            Debug.Print(dbClass.GetName());
            foreach (var dbField in dbClass.GetStoredFields()) {
                Debug.Print("    " + dbField.GetName());
            }
        }
    }
}   
于 2013-03-22T06:58:09.787 に答える