Хороший вопрос. Насколько я знаю, это невозможно. (Единственный способ - скопировать данные на новый тип.
Как вы сказали, когда вы копируете данные в новый тип, у вас есть проблема что есть много ссылок, которые указывают на старый экземпляр вместо нового экземпляра.И связывание действительно проверяет тип.
Это не оставляет возможности, кроме как справляться и обновлять все ссылки, что, конечно, утомительный процесс. = (Таким образом, запрос для всего объекта, который вам нужен для изменения типа. Скопируйте данные в новый объект, затем запросите все объекты, ссылающиеся на старый объект, и замените ссылку.
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 @ Gamlor Я делаю это так (копирование + запрос/обновление всех ссылок), чувствует себя ужасно, поэтому я надеялся на какой-то определенный способ запросить/обновить все ссылки, указывающие на объект. В конце было не так много ссылок в моем сценарии (около 6). Я оставлю этот вопрос открытым, для любой другой обратной связи по этому вопросу. – eglasius
Согласен, лучший метод будет очень приятным. – Gamlor