DDD, объекты значений и ORM
-
09-09-2019 - |
Вопрос
Объекты-значения не имеют идентификатора.ORM требуется идентификатор для обновления базы данных.
Как обмануть ORM?
(Пометка Id для объекта value как internal не будет работать, потому что ORM находится в другой сборке и перемещение его в ту же сборку неприемлемо).
Заранее благодарю.
Решение
Насколько я понимаю DDD, объекты значений - это всего лишь способ разделения ваших сущностей.Если объект value должен храниться с идентификатором в базе данных, это не объект value.
Пример:
Модель предметной области выглядит следующим образом (C #):
public class Customer : Entity
{
public Guid CustomerID { get; }
public string LastName { get; set; }
public Address HomeAddress { get; set; }
}
public class Address : ValueObject
{
public string Street { get; set; }
public string City { get; set; }
public string ZipCode { get; set; }
}
Соответствующая таблица базы данных будет выглядеть примерно так (Псевдо-SQL):
CREATE TABLE Customers
(
CustomerID,
LastName,
HomeAddress_Street,
HomeAddress_City,
HomeAddress_ZipCode,
)
Чтобы сохранить адреса в отдельной таблице, вы бы сделали ее объектом, который имеет идентификатор.
Другие советы
Когда Эрик Эванс говорит о "сущности имеют идентичность, объекты значений - нет", он не имеет в виду столбец ID в базе данных - он говорит об идентичности как концепция.
У ВОс нет концептуальный идентичность.Это не значит, что они не должны были настойчивость идентичность.Не позволяйте реализации персистентности затуманивать ваше понимание сущностей в сравнении с VOs.
Смотрите мой пост здесь.
Лично у меня есть поле Id в объекте value - я рассматриваю его как еще один атрибут объекта value (например, имя, местоположение и т.д.).
Возможно, это не настоящий DDD, но у меня это работает.