0

我有三张桌子:

tbl .属性:

int Id  
int AttributeName  

tbl .产品:

public int Id
public string  

tbl.ProductAttribute

int ProductId  
int AttributeId  
string Value  

当我巧合tbl.ProductAttribute地为 2 个外键插入相同的值时,它会引发异常:

我的形象

我刚刚想到了一种通过插入一个新列来解决这个问题的方法tbl.ProductAttribute

int ProductAttributeId  

然后将其设置为主键并使用ProductId,AttributeId作为外键。但这是解决这个问题的方法吗?如果是这样,有没有更好的方法来解决这个问题而无需更改代码?

4

2 回答 2

1

您的ProductAttribute表是多对多连接表,其中ProductIdAttributeId是该表的复合主键。所以 和 的集合ProductId必须AttributeId是唯一的,因为主键不能重复。如果要为集合插入重复值,ProductId那么AttributeId您的ProductAttribute模型类应如下所示:

public class ProductAttribute 
{
   [Key]
   [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
   public long ProductAttributeId { get; set;}

   public int ProductId  { get; set;}

   public int AttributeId  { get; set;}

   public string Value  { get; set;}
}

此外,如果您希望 , 的集合可以重复,但 , 的集合应该是唯一的ProductId,那么您的模型类应如下所示:AttributeIdProductIdAttributeIdValueProductAttribute

public class ProductAttribute 
{
    [Key, Column(Order = 0)]
    public int ProductId  { get; set;}

    [Key, Column(Order = 1)]
    public int AttributeId  { get; set;}

    [Key, Column(Order = 2)]
    public string Value  { get; set;}
}
于 2018-08-23T15:33:34.890 回答
0

主键必须是表行的唯一标识符。如果您有共享密钥的副本,则它不能是主键。只需为行标识添加另一列并增加它(或根据您的需要生成 guid)。您可以为外键创建非唯一索引以提高运行连接时的性能。

于 2018-08-23T15:26:37.813 回答