2009-06-04 69 views
8

值对象没有身份。 ORM需要身份来更新数据库。DDD,值对象和ORM

如何欺骗ORM?

(标记为值为内部的对象不起作用,导致ORM存在于不同的程序集中并将它移动到同一个程序集中是不可接受的)。

在此先感谢。

回答

4

就我对DDD的理解而言,值对象只是一种划分实体的方法。如果一个值对象应该在数据库中存储一个ID,它不是一个值对象。

例子:

域模型看起来像这样(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的实体。

+5

但是那么域模型只是数据库的1:1,地址仍然可以是一个值对象,并且仍然有一个单独的表。 – TWith2Sugars 2009-06-05 08:30:56

+1

不,它不是数据库的1:1。 您有一个Customer类和一个Adress类(它是值对象)。在NHibernate中,一个值对象被映射为一个组件。 只要你有一个实体需要一个Id,它不再是一个值对象。 – 2009-06-05 08:39:47

3

就我个人而言,我在值对象中有Id字段 - 我将它作为值对象的另一个属性(例如名称,位置等)。

这可能不是真正的DDD,但它适用于我。

+2

我不认为这是有问题的。埃里克埃文让每个人的头脑都在旋转,因为在没有举例的情况下谈论概念很容易。 – 2012-11-16 22:11:23

35

当埃里克埃文斯谈到“实体具有身份,价值对象不”时,他不是在谈论数据库中的ID列 - 他谈论的身份是概念

VOs没有概念的身份。这并不意味着他们不应该有持久性的身份。不要让持久性实现影响您对实体vs VOs的理解。

看到我的帖子here