表具有主键,因为在实体框架代码中为两个外键插入相同值时,两个外键会引发异常

时间:2018-08-23 15:18:35

标签: asp.net-mvc entity-framework

我有三个表:

tbl.Attribute

yarn run eject

tbl。产品

int Id  
int AttributeName  

tbl.ProductAttribute

public int Id
public string  

当我巧巧地为两个外键插入具有相同值的int ProductId int AttributeId string Value 时,会抛出异常:

My image

我刚刚想到了一种解决方法,可以在tbl.ProductAttribute

中插入新列
tbl.ProductAttribute

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

2 个答案:

答案 0 :(得分:1)

您的ProductAttribute表是多对多连接表,其中ProductIdAttributeId是该表的组合主键。因此ProductIdAttributeId的集合必须唯一,因为主键不能重复。如果要为ProductIdAttributeId的集合插入重复的值,则您的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;}
}

此外,如果您希望ProductIdAttributeId的集合可以重复,但是ProductIdAttributeIdValue的集合应该是唯一的,您的ProductAttribute模型类应如下:

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;}
}

答案 1 :(得分:0)

主键必须是表行的唯一标识符。如果您的共享密钥重复,那么它就不能成为主密钥。只需添加另一列用于行标识并增加它(或根据您的需要生成GUID)。您可以为外键创建非唯一索引,以提高运行联接时的性能。