2010-08-20 5 views
2

Я хочу изменить все объекты, соответствующие условию использования определенного/нового подкласса.Замена хранимого объекта db4o экземпляром подкласса

Нет других подклассов, используемых с сохраненными объектами, поэтому во всех случаях это изменение от базового класса к его подклассу.

Чтобы сохранить все ссылки, указывающие на эти объекты, я попытался использовать bind, чтобы заменить их новыми экземплярами подкласса (копирование всех данных), но, похоже, привязывает его только к элементам того же определенного класса.

Есть ли способ сделать это, что не требует добавления кода для явного обновления каждой ссылки, указывающей на эти объекты? Один вызов, который заменяет все ссылки с одного объекта на другой, будет большим.

ответ

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 и попытаться ее запустить.

+1

+1 @ Gamlor Я делаю это так (копирование + запрос/обновление всех ссылок), чувствует себя ужасно, поэтому я надеялся на какой-то определенный способ запросить/обновить все ссылки, указывающие на объект. В конце было не так много ссылок в моем сценарии (около 6). Я оставлю этот вопрос открытым, для любой другой обратной связи по этому вопросу. – eglasius

+2

Согласен, лучший метод будет очень приятным. – Gamlor