Can we use List<ValueObject>
inside entity? or we should use them as List<entity>
?
When I use 'List<Discount>
' inside my 'Product
' entity class, entity framework creates a 'Discount' table with a generated column id.
Is it OK that i have defined Discount as List of value objects? When a value object is used as a list, is it better to use it as an entity with its identity?
The second question is about updating 'List<Discont>
' inside entity. how can I update this value object list inside its entity( add,remove discount)?
thanks
As mentioned in the comments by @Ivan Stoev, your domain model is not your database model. You need to model your domain in an object-oriented way with, ideally, no regard for the database. BTW, having some identifier in a Value Object
does not make it an Entity
. An Entity
would, however, always require a unique identifier within that entity set but an identifier isn't the defining factor to make a class an entity (that would be whether it has its own lifecycle).
In the real world one would need to be pragmatic about the general guidance. For instance, if you need an identifier of sorts for your value object then that is fine. However, it may be that there is already something there that may be used. In an OrderItem
one would use the ProductId
since there should only be a single item for each product. In your Discount
scenario perhaps there is a DiscountType
where only unique discount types are permitted. On the point of mutable value objects, the reason a value object is usually not mutable is that it represents a particular value. You would never change 10
since that would be another value. It would seem that one would be changing 10
to, say, 15
when you need 15
but, in fact, that 15
is another value object. Again, one would need to be pragmatic and in many circumstances we end up using a Value Object
that isn't as primitive as a single value so it may make sense to alter something on the value object. An order item is certainly not an entity but one would need to change the Quantity
on the item every-so-often. Well, that may be another discussion around Quote
/Cart
vs Order
but the concepts are still applicable.
On another note, I tend to nowadays define any "value object" that exists only within an aggregate as a nested class within the aggregate. I would not have Order
and OrderItem
classes but instead an Item
class within the Order
class... Order.Item
. That is a design choice though but I thought I'd mention it.