Я рассматривал возможность использования OODBMS db4o с недавним проектом Silverlight / RIA Services, но есть один момент, в котором я мог бы воспользоваться некоторыми советами - как заставить работать ассоциации. Службы RIA требуют, чтобы вы пометили все связанные с вами объекты с атрибутом AssociationAttribute. Конструктор AssociationAttribute требует, чтобы вы указали ключ вашей сущности для связанной сущности и ключ самой ассоциированной сущности.
В качестве примера представьте, что у меня есть класс Racer со свойствами CarID и Car и класс Car со свойством ID. Мой класс Racer будет выглядеть примерно так:
class Racer
{
public int ID { get; set; }
public int? CarID { get; set; }
[Association("Racer_Car", "CarID", "ID")]
public Car Car { get; set; }
}
Проблема, которую я вижу при использовании db4o (или любой OODBMS), заключается в том, что внешние ключи и первичные ключи не существуют и не должны существовать, и в результате мне не нужны Racer.CarID и Car.ID. свойства. Чтобы это работало с RIA Services, мне нужно было бы создать свои собственные уникальные ключи, но я не против, я просто не знаю, как это сделать.
Итак, мой вопрос к вам: «Как бы вы создали эти ключи / идентификаторы»?
Поскольку не существует никакой концепции автоматического увеличения сгенерированного поля (я ничего не знаю об этом), мне придется выбирать между попыткой вручную, безопасным увеличением ключей или использованием чего-то вроде Guid. Поскольку с первым было бы сложнее управлять несколькими пользователями и / или многопоточностью, я думаю, что использование Guid было бы самым простым решением.
Итак, давайте рассмотрим использование Guid. Самым простым решением было бы создать мои свойства идентификатора, как я это делал в приведенном выше примере, но использовать Guid вместо int. Мне нужно было бы установить идентификатор для нового Guid после создания новых сущностей - тогда, когда бы я ни устанавливал свойство Racer.Car, мне также нужно было бы устанавливать Racer.CarID.
Выполнение этого вручную может привести к ошибкам, поэтому я бы хотел, чтобы многие из них обрабатывались в методах получения и установки свойств, но я не уверен, что это лучший способ реализовать это.
Это то, о чем я думал до сих пор. Думаю, я посмотрю, как сгенерированный в Linq-SQL код решает некоторые из этих проблем - возможно, я найду ключ к разгадке.
Любые предложения будут с благодарностью.
Спасибо
-Charles