値オブジェクトにはIDがありません。 ORMはデータベースを更新するためにIDが必要です。DDD、値オブジェクト、ORM
ORMをトリックする方法はありますか?
(内部オブジェクトとしての値オブジェクトのマーキングIDは機能しません。そのため、ORMは別のアセンブリに存在し、同じアセンブリに移動させることはできません)。
ありがとうございます。
値オブジェクトにはIDがありません。 ORMはデータベースを更新するためにIDが必要です。DDD、値オブジェクト、ORM
ORMをトリックする方法はありますか?
(内部オブジェクトとしての値オブジェクトのマーキングIDは機能しません。そのため、ORMは別のアセンブリに存在し、同じアセンブリに移動させることはできません)。
ありがとうございます。
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を持つエンティティにします。
個人的に私は値オブジェクトにIdフィールドを持っています - 私はそれを値オブジェクトの別の属性(名前、場所など)として扱います。
これは本当のDDDではないかもしれませんが、私のために働きます。
私はそれに全く問題はないと思います。エリックエヴァンは、例を挙げずにコンセプトについて話すのは簡単だから、誰もが頭を振り回しています。 –
Eric Evansが「エンティティはIDを持ち、バリューオブジェクトはありません」と話すとき、彼はデータベース内のID列については話していません。つまりIDはという概念です。
VOはありません。概念アイデンティティ。つまり、の永続性の識別情報を持つべきではありません。永続性の実装でエンティティとVOの理解を曇らせないようにしてください。
私のポストhereを参照してください。
しかし、私はコードで概念的アイデンティティの欠如を示したいと思います。 Btw、私は前にそのポストを見た。 –
要件を明確にするには、VOオブジェクトのIDプロパティを非表示にしたいが、IDプロパティを表示するにはORMが必要ですか? 2つの質問: 1)ORMでプライベート/内部のフィールドにアクセスできますか? (NHibernateのような) 2)VOのIDプロパティを「隠す」ことによってどれくらいの利益を得ますか? –
私はNHibernateを使用している言及を忘れた...だから - どのようにNHibernateでそれを行うには? –
しかし、ドメインモデルはデータベースのわずか1:1であり、アドレスは依然として値オブジェクトであり、依然として別のテーブルを持つことができます。 – TWith2Sugars
いいえ、データベースの1:1ではありません。 CustomerクラスとAdressクラス(値オブジェクト)があります。 NHibernateでは、値オブジェクトはコンポーネントとしてマッピングされます。 Idを必要とするエンティティを持つと、すぐに値オブジェクトではなくなります。 –
しかし、アドレスをテーブルに保存する必要がある場合は、データベースによってIDが必要になります。データベースがIDを必要としているからといって、オブジェクトが即座にエンティティであるとは限りません。 – TWith2Sugars