我想更改所有匹配条件的对象以使用特定/新的子类。
没有其他子类与存储的对象一起使用,因此在所有情况下都是从基类到其子类的更改。
为了使所有引用都指向这些对象,我尝试使用 bind用子类的新实例替换它们(复制所有数据),但似乎仅将其绑定(bind)到同一特定类的项目。
有没有什么方法可以做到这一点,而不需要添加代码来显式更新指向这些对象的每个引用?将一个对象的所有引用替换为另一个对象的单个调用会很棒。
最佳答案
好问题。据我所知这是不可能的 =(。唯一的方法是将数据复制到新类型。
正如您所说,当您将数据复制到新类型时,您会遇到一个问题,即有很多引用指向旧实例而不是新实例。并且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)”到新对象应该是安全的。因此,如果现有对象突然指向新的子类型,它仍然应该有效。那么您可以做什么来删除 Bind-Method-implementation 中的检查并尝试运行它。
关于c# - 用子类的实例替换 db4o 存储对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3533820/