Где я могу найти реализацию C # шаблона «Поле идентичности» (Фаулера), который поддерживает несколько полей разных типов - PullRequest
2 голосов
/ 12 февраля 2011

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

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

Основная цель, которую я преследую, это использование шаблона Identity Map. Я считаю, что этот шаблон более или менее требует шаблона Identity Field для его поддержки. Я буду использовать конструкцию Identity Field в качестве ключа к своему словарю

Есть идеи?

Спасибо

Ответы [ 2 ]

1 голос
/ 12 февраля 2011

Я думаю, что для реализации аналогичного шаблона для многоколоночного PK вам просто нужно создать поле / свойство в вашем классе для каждого из столбцов PK в таблице.

Например, если у вас есть таблица «Message» с PK с long, guid и datetime, вашему классу просто нужно будет включить свойство long, Guid и DateTime.

Возможно, вы также захотите реализовать Equals () и GetHashCode () для объекта, использующего эти поля PK, потому что вы хотите, чтобы эти объекты сравнивались в терминах базы данных, а не в адресе объекта в памяти. GetHashCode важен, потому что вы хотите, чтобы объекты с одинаковыми свойствами PK производили одинаковый хэш-код. Чтобы реализовать GetHashCode, я бы порекомендовал посмотреть на ответ Джона Скита: Каков наилучший алгоритм для переопределенного System.Object.GetHashCode?

Шаблон Фаулера "Поле идентичности" может предполагать, что в ваших таблицах есть один столбец суррогатного ПК, и поэтому он указывает его так, как он делает.

0 голосов
/ 12 февраля 2011

Выезд S # arp Архитектура . Когда вы наследуете от их Entity объекта, вы можете декорировать столько свойств, сколько захотите, с помощью DomainSignatureAttribute. Эти свойства будут затем рассматриваться как идентификатор объекта при реализации Equals и GetHashCode, предоставленных в Entity.

...