Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

DDD, value objects and ORM

Value objects do not have identity. ORM needs identity to update the database.

How to trick ORM?

(Marking Id for value object as internal won't work because ORM lives in a different assembly and moving it to the same assembly is not acceptable).

Thanks in advance.

like image 459
Arnis Lapsa Avatar asked Jun 04 '09 08:06

Arnis Lapsa


3 Answers

When Eric Evans talks about "entities have identity, Value Objects do not", he's not talking about an ID column in the database - he's talking about identity as a concept.

VOs have no conceptual identity. That doesn't mean that they shouldn't have persistence identity. Don't let persistence implementation cloud your understanding of Entities vs VOs.

See my post here.

like image 106
Vijay Patel Avatar answered Sep 28 '22 11:09

Vijay Patel


As far as my understanding of DDD goes value objects are just a way to partition your entities. If a value object should be stored with an ID in the database it's not a value object.

Example:

The domain model looks like this (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; }
}

The corresponding database table would look something like this (Pseudo-SQL):

CREATE TABLE Customers
(
    CustomerID,

    LastName,

    HomeAddress_Street,

    HomeAddress_City,

    HomeAddress_ZipCode,
)

To store the addresses in a seperate table you would make it an entity which has an ID.

like image 22
Albic Avatar answered Sep 28 '22 10:09

Albic


Personally I have the Id field in the value object - I treat it as another attribute of the value object (such as name, location etc).

It may not be true DDD but it works for me.

like image 41
TWith2Sugars Avatar answered Sep 28 '22 10:09

TWith2Sugars