2009-06-04 70 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