Где найти реализацию C# шаблона "Поле идентичности" (Фаулера), который поддерживает несколько полей разных типов
Я нашел одно, которое позволяет несколько полей типа long. Тем не менее, я не уверен, насколько это полезно, потому что иногда у нас могут быть гиды или даже даты, например.
Я мог бы также изменить его, чтобы он соответствовал моим потребностям, но, похоже, это будет настолько распространенная просьба, чтобы я мог найти что-то проверенное, испытанное и верное, а не создавать его с нуля.
Основная цель, которую я преследую, это использование шаблона Identity Map. Я считаю, что этот шаблон более или менее требует шаблона Identity Field для его поддержки. Я буду использовать конструкцию Identity Field в качестве ключа к своему словарю
Есть идеи?
Спасибо
2 ответа
Я думаю, что для реализации аналогичного шаблона для PK с несколькими столбцами, вам просто нужно создать поле / свойство в вашем классе для каждого из столбцов PK в таблице.
Например, если у вас есть таблица "Message" с PK с long, guid и datetime, вашему классу нужно будет просто включить свойство long, Guid и DateTime.
Возможно, вы также захотите реализовать Equals() и GetHashCode() для объекта, использующего эти поля PK, потому что вы хотите, чтобы эти объекты сравнивались в терминах базы данных, а не в терминах адреса объекта в памяти. GetHashCode важен, потому что вы хотите, чтобы объекты с одинаковыми свойствами PK производили одинаковый хеш-код. Чтобы реализовать GetHashCode, я бы порекомендовал посмотреть на ответ Джона Скита: каков наилучший алгоритм для переопределенного System.Object.GetHashCode?
Шаблон Фаулера "Поле идентичности" может предполагать, что в ваших таблицах есть один столбец суррогатного ПК, и поэтому он указывает его так, как он это делает.
Проверьте архитектуру S#arp. Когда вы наследуете от их Entity
объект, вы можете украсить столько свойств, сколько вы хотите с DomainSignatureAttribute
, Эти свойства будут затем рассматриваться как идентичность объекта при реализации Equals
а также GetHashCode
это предусмотрено в Entity
,