我尝试了不同的模型和配置,但没有任何进展。已搜索此特定用法但没有成功,发现接近但不一样。
我有一个与其他产品相关的产品,到目前为止,如果只有一个关系,例如“相关产品”,那么问题就来了。添加其他关系,例如“类似”时,问题就来了。
我所追求的是一个自引用的命名关系,理想情况下是一个三列外键表;产品 ID、相关产品 ID、关系 ID
一个产品可以有多个命名关系,一个关系有一个或多个产品(相关的)。我想避免多次定义关系的名称。
一种想法如下:
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; }
}
上面的示例是想要的结果布局,我希望在检索时如何访问它,很可能需要以这种方式创建。从具有三列映射表的 db 角度来看,下面似乎更干净
我的问题是:
- 推荐的方法是什么,为什么?
- 如何正确设置与键的映射,以便数据库尽可能了解关系?