1
          ユーザー
      / \  
     / \
  MTO MTO
   / \  
  / \
製品----MTM----タグ

エンティティを使用してこのようなスキーマを作成する方法に関するドキュメントがあるのだろうか。私は、どのエンティティが関係の何に対して責任を負うべきか疑問に思っていました。

例えば:

商品にタグを追加したいとしましょう。私は私の中にこのような方法を持っています

製品エンティティ:

    public virtual void AddTag(Tag tag)
    {
        this.Tags.Add(tag); // IList<Tag> Tags
        tag.AddProduct(this);
    }

最初に、タグ オブジェクトをタグのリストに追加します。次に、そのタグ オブジェクトは「この」製品を独自の製品リストに追加します。

ここまでは順調ですね。

しかし、商品をタグに追加したい場合はどうすればよいでしょうか。私は私の中にこのような方法を持っています

タグ エンティティ:

    public virtual void AddProduct(Product product)
    {
        this.Products.Add(product); // IList<Product> Products
        // product.AddTag(this);
    }

最初に、製品オブジェクトをタグ オブジェクトの製品リストに追加します。次に、「this」タグを製品に追加できましたが、ここで行き詰まりました。コメント化されたメソッドは、AddTag などを呼び出す AddProduct にコールバックするため、stackoverflow エラーをスローします。

私のスキーマが本当に正しいかどうかもわかりません。ユーザーからタグへの MTO は、ユーザーが持っているタグを確認したいときに簡単にするためにあります。

それで、誰かが私を正しい方向に向けることができるかどうか疑問に思っていましたか?

前もって感謝します、

ピクルス

4

4 に答える 4

1

商品にタグを追加する方がはるかに理にかなっています。商品をタグに追加することは許可しません。

多対多の関係では、どのエンティティが関係の主要なエンティティであるかを決定し、それを介してコレクションへのアクセスを制御する必要があります。他のエンティティのAddメソッドを内部としてマークすることにより、アクセスを制御できます。

タグエンティティ:

internal virtual void AddProduct(Product product)
{
    this.Products.Add(product);
}
于 2010-01-29T16:10:59.233 に答える
0

MTMリレーションシップマンを使用しないでください。代わりに、ProductIDとTagIDの2つの列のみを含む新しいテーブルProducts_Tagsを作成する必要があります。このような両方の外部キー:

          Users
      /           \  
     /             \ 
  M-T-O           M-T-O 
   /                 \  
  /                   \
Products              Tags
  \                    /
   \                  /
    \                /
     \               /
      \Products_Tags/
于 2010-01-29T16:01:33.483 に答える
0

リストにすでにこの要素が含まれているかどうかを確認することをお勧めします。

if ( !this.Tags.Contains(tag) ) 
{ 
 this.Tags.Add(tag);
 product.AddTag(this);
}
于 2010-01-29T16:16:11.593 に答える
0

Tag.AddProduct はタグの内部製品リストにのみ追加する必要があり、Product.AddTag は製品の内部タグ リストにのみ追加する必要があります。DB への永続化では、クロス マッピングを処理する必要があります。各製品を保存すると、マッピング テーブルに行が保存され、各タグを同じように保存する必要があります。

ドメイン内でこのロジックを維持することは、私には意味がありません。また、実際の利点もわかりません。製品には多くのタグがあり、タグには多くの製品があります - これはドメインがどのように構造化されているかであり、永続層が多対多の関係を処理します。

このようにして、どの製品についても、どのタグが付いているかを知ることができ、その逆も同様です。これだけで本当に知る必要があります。

class Users
{
  private Tags tags;
  private Products products;
}

class Tags : IList<Tag> {}
class Tag
{
  private Products products;
  public void AddProduct(Product product);
}

class Products : IList<Product> {}
class Product
{
  private Tags tags;
  public void AddTag(Tag tag);
}
于 2010-01-29T16:47:30.173 に答える