17

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

ORMをだます方法は?

(ORM は別のアセンブリにあり、同じアセンブリに移動することはできないため、値オブジェクトの Id を internal としてマークしても機能しません)。

前もって感謝します。

4

6 に答える 6

51

エリック・エバンスが「エンティティにはアイデンティティがあり、値オブジェクトにはない」と話すとき、彼はデータベースのID列について話しているのではなく、概念としてのアイデンティティについて話しているのです。

VOには概念的なアイデンティティはありません。それは彼らが永続的なアイデンティティを持つべきではないという意味ではありません。永続性の実装によって、エンティティとVOの理解が曇らないようにしてください。

ここに私の投稿を参照してください。

于 2009-06-05T10:30:31.817 に答える
5

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 を持つエンティティにします。

于 2009-06-05T08:26:41.910 に答える
4

個人的には、値オブジェクトに Id フィールドがあります。値オブジェクトの別の属性 (名前、場所など) として扱います。

それは真の DDD ではないかもしれませんが、私にとってはうまくいきます。

于 2009-06-05T08:06:06.977 に答える
0

前の回答で言及された値オブジェクトを永続化するためのすべてのオプション (値オブジェクトのプロパティをそれらが属するエンティティ テーブルの列として平坦化する、またはデータ モデルの一意の ID を含めることによって別のテーブルに永続化するなど) は有効であり、適切です。説明した。そしてもちろん、これらのオプションは通常、特定の基盤となるデータベース テクノロジとは無関係に適用できます。これは大きな利点です。

しかし、多くの場合、十分かつ簡単に実装できる他のオプションについて言及することは、少なくとも価値があると思います。

値オブジェクトを JSON 表現で保存する

もちろん、技術的な制約にもよりますが、最近では多くのデータベースや ORM ソリューションが、JSON 表現のサポートを組み込みで提供しています。検索オプションを含むものもあります。大量の項目が予想されない場合は、このリストをオブジェクトの JSON コレクションとしてエンティティ テーブルに直接永続化することで、エンティティ内の値オブジェクトのリストにこのアプローチを使用することもできます。

もちろん、JSON の代わりに他の形式 (プレーン テキストや XML など) もサポートされていますが、私の経験では、JSON が最も快適であることがわかりました。

ドキュメントベースのストレージ ソリューションを使用する

また、 MongoDBなどのドキュメント ベースのデータベース テクノロジを選択すると、ドメイン モデル エンティティを永続化するための新しいオプションが提供されることにも言及する価値があります。オブジェクト。

于 2020-08-03T22:57:07.863 に答える