さまざまなモデルと構成を試しましたが、進歩がありませんでした。この特定の使用法を検索しましたが、成功しませんでした。近いが同じではありません。
私は他の製品に関連する製品を持っています。これまでのところ、「関連製品」などの関係が 1 つだけであれば問題ありませんが、「類似」などの関係を追加すると問題が発生します。
私が求めているのは、自己参照の名前付きリレーション、理想的には 3 列の外部キー テーブルです。ProductId、RelatedProductId、RelationId
製品には複数の名前付きリレーションを含めることができ、リレーションには 1 つ以上の製品 (関連するもの) を含めることができます。リレーションの名前を複数回定義することは避けたいと思います。
1つのアイデアは次のとおりです。
public class Product
{
public int Id { get; set; }
public string Title { get; set; }
public virtual ICollection<Relation> Relations { get; set; }
}
public class Relation
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Product> Products { get; set; }
}
別のアイデアは、特別なテーブルを使用しています。
public class Product
{
public int Id { get; set; }
public string Title { get; set; }
public virtual ICollection<ProductRelation> Relations { get; set; }
}
public class Relation
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<ProductRelation> Products { get; set; }
}
public class ProductRelation
{
[Key, Column(Order = 0)]
public virtual int ProductId { get; set; }
[Key, Column(Order = 1)]
public virtual int RelatedProductId { get; set; }
[Key, Column(Order = 2)]
public virtual int RelationId { get; set; }
[ForeignKey("ProductId")]
public virtual Product Product { get; set; }
[ForeignKey("RelatedProductId")]
public virtual Product RelatedProduct { get; set; }
[ForeignKey("RelationId")]
public virtual Relation Relation { get; set; }
}
上記の例は、必要な結果のレイアウトです。取得したときにどのようにアクセスしたいか、おそらくそのように作成する必要があります。以下は、3 列のマッピング テーブルを使用した db の観点から見ると、よりクリーンなようです。
私の質問は次のとおりです。
- 推奨されるアプローチとその理由は何ですか?
- データベースが関係を可能な限り理解できるように、キーを使用してマッピングを適切に設定するにはどうすればよいですか?