我想更改符合条件的所有对象以使用特定/新子类。
没有其他子类与存储对象一起使用,因此它在所有情况下都是从基类到其子类的变化。
为了保持所有引用都指向这些对象,我尝试使用bind将它们替换为子类的新实例(复制所有数据),但它似乎仅将其限制为相同的项目特定班级。
有没有办法做到这一点,不需要添加代码来显式更新指向这些对象的每个引用?将一个对象的所有引用替换为另一个对象的单个调用将非常棒。
答案 0 :(得分:4)
好问题。据我所知,这是不可能的=(。唯一的方法是将数据复制到新类型。
正如您所说,当您将数据复制到新类型时,您会遇到许多引用指向旧实例而不是新实例的问题。而绑定确实会检查类型。
除了处理和更新所有参考文献之外别无选择,这当然是一个繁琐的过程。 =(因此查询您需要更改类型的所有对象。将数据复制到新对象。然后查询引用旧对象的所有对象并替换引用。
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-Method-implementation中的检查并尝试运行它。