代码之家  ›  专栏  ›  技术社区  ›  eglasius

用子类的实例替换db4o存储对象

  •  2
  • eglasius  · 技术社区  · 14 年前

    没有其他子类与存储对象一起使用,因此在所有情况下都是从基类到其子类的更改。

    为了使所有引用都指向这些对象,我尝试使用 bind 将它们替换为子类的新实例(复制所有数据),但它似乎只绑定到同一特定类的项。

    有没有不需要添加代码来显式更新指向这些对象的每个引用的方法?一个调用就可以替换从一个对象到另一个对象的所有引用。

    1 回复  |  直到 14 年前
        1
  •  4
  •   Gamlor Gabriele Ran    14 年前

    问得好。据我所知这是不可能的。唯一的方法是将数据复制到新类型。

    正如您所说,当您将数据复制到新类型时,您会遇到一个问题,即有许多引用指向旧实例而不是新实例。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方法实现中的检查并尝试运行它。