DDD, объекты-значения и ORM - PullRequest
13 голосов
/ 04 июня 2009

Значимые объекты не имеют идентичности. ORM нужна личность для обновления базы данных.

Как обмануть ORM?

(Маркировка Id для объекта-значения как внутреннего не будет работать, поскольку ORM находится в другой сборке, а перемещение в ту же сборку недопустимо).

Заранее спасибо.

Ответы [ 3 ]

43 голосов
/ 05 июня 2009

Когда Эрик Эванс говорит о «сущностях, у которых есть идентичность, у объектов значения нет», он не говорит о столбце идентификаторов в базе данных - он говорит об идентичности как концепции .

ВО не имеют концептуальной идентичности. Это не значит, что они не должны иметь постоянство идентичность. Не позволяйте реализации постоянства затмевать ваше понимание сущностей против виртуальных организаций.

Смотрите мой пост здесь .

5 голосов
/ 05 июня 2009

Насколько я понимаю DDD, объекты-ценности - это просто способ разделения ваших сущностей. Если объект значения должен храниться с идентификатором в базе данных, это не объект значения.

Пример:

Модель предметной области выглядит следующим образом (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,
)

Чтобы сохранить адреса в отдельной таблице, вы должны сделать ее сущностью с идентификатором.

4 голосов
/ 05 июня 2009

Лично у меня есть поле Id в объекте значения - я рассматриваю его как еще один атрибут объекта значения (например, имя, местоположение и т. Д.).

Возможно, это не правда, DDD, но у меня это работает.

...