正如我在db4o documentation(.net版本)中读到的那样,我认为要重命名一个类中的字段,我必须将以下内容添加到我的代码中(并重命名该类中的实际字段,当然):
IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
configuration.Common.ObjectClass("Namespace.ClassName, AssemblyName").
ObjectField("fieldname").Rename("newfieldname");
然后将此代码留在那里。但我测试了它并且它不起作用(数据库中的对象不会加载重命名的字段)。做了什么工作是按照this page中的说明进行的,这些是
这对我来说有点奇怪。我的程序需要只使用重命名调用运行一次,并且运行没有重命名调用但重命名实际字段。问题是:有没有办法在一步中进行有效的重命名?
有效的步骤可能意味着额外的努力,例如,在更新嵌入式(移动)应用程序的过程中 - 在客户端上安装新版本(重构)之前,有必要运行重命名调用一次。有没有办法避免它?我是否遗漏了某些内容,或者是否有其他方法可以在db4o数据库中重命名fiel?
答案 0 :(得分: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
也可以使用下面函数给出的完全限定类名来指定,该函数列出了所有存储的类和字段名。您会注意到,自动属性生成的私有字段的格式为<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());
}
}
}
}