2009-06-04 11 views
8

値オブジェクトにはIDがありません。 ORMはデータベースを更新するためにIDが必要です。DDD、値オブジェクト、ORM

ORMをトリックする方法はありますか?

(内部オブジェクトとしての値オブジェクトのマーキングIDは機能しません。そのため、ORMは別のアセンブリに存在し、同じアセンブリに移動させることはできません)。

ありがとうございます。

答えて

4

DDDの理解は、値オブジェクトはエンティティを分割する単なる方法です。値オブジェクトがIDをデータベースに格納する必要がある場合、値オブジェクトではありません。

例:

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, 
) 

ドメインモデルは、この(C#の)のように見えます

アドレスを別のテーブルに格納するには、IDを持つエンティティにします。

+5

しかし、ドメインモデルはデータベースのわずか1:1であり、アドレスは依然として値オブジェクトであり、依然として別のテーブルを持つことができます。 – TWith2Sugars

+1

いいえ、データベースの1:1ではありません。 CustomerクラスとAdressクラス(値オブジェクト)があります。 NHibernateでは、値オブジェクトはコンポーネントとしてマッピングされます。 Idを必要とするエンティティを持つと、すぐに値オブジェクトではなくなります。 –

+6

しかし、アドレスをテーブルに保存する必要がある場合は、データベースによってIDが必要になります。データベースがIDを必要としているからといって、オブジェクトが即座にエンティティであるとは限りません。 – TWith2Sugars

3

個人的に私は値オブジェクトにIdフィールドを持っています - 私はそれを値オブジェクトの別の属性(名前、場所など)として扱います。

これは本当のDDDではないかもしれませんが、私のために働きます。

+2

私はそれに全く問題はないと思います。エリックエヴァンは、例を挙げずにコンセプトについて話すのは簡単だから、誰もが頭を振り回しています。 –

35

Eric Evansが「エンティティはIDを持ち、バリューオブジェクトはありません」と話すとき、彼はデータベース内のID列については話していません。つまりIDはという概念です。

VOはありません。概念アイデンティティ。つまり、の永続性の識別情報を持つべきではありません。永続性の実装でエンティティとVOの理解を曇らせないようにしてください。

私のポストhereを参照してください。

+0

しかし、私はコードで概念的アイデンティティの欠如を示したいと思います。 Btw、私は前にそのポストを見た。 –

+1

要件を明確にするには、VOオブジェクトのIDプロパティを非表示にしたいが、IDプロパティを表示するにはORMが必要ですか? 2つの質問: 1)ORMでプライベート/内部のフィールドにアクセスできますか? (NHibernateのような) 2)VOのIDプロパティを「隠す」ことによってどれくらいの利益を得ますか? –

+0

私はNHibernateを使用している言及を忘れた...だから - どのようにNHibernateでそれを行うには? –