问得好。据我所知这是不可能的。唯一的方法是将数据复制到新类型。
正如您所说,当您将数据复制到新类型时,您会遇到一个问题,即有许多引用指向旧实例而不是新实例。bind确实检查了类型。
IObjectContainer container = ... //
foreach(var oldObject in container.Query<MyType>())
{
NewSubType newCopy = copyToSubType(oldObject); // copy the data
var referencesFromTypeA = from TypeA a in container
where a.ReferenceToMyType == oldObject
select a
// repeat this for all types which can refer to the object which are copied
// it can certainly be generified
foreach(var referenceToUpdate in referencesFromTypeA)
{
referenceToUpdate.ReferenceToMyType=newCopy;
container.Store(referenceToUpdate);
}
container.Store(newCopy);
container.Delete(oldObject);
}
现在,如果您想冒险,可以使用另一种可能的方法:稍微更改db4o代码。因为要将对象更改为子类型,所以将其“绑定”到新对象应该是安全的。因此,如果现有对象突然指向新的子类型,它仍然可以工作。那么您可以做些什么来删除Bind方法实现中的检查并尝试运行它。