我有三个表:
tbl.Attribute :
yarn run eject
tbl。产品:
int Id
int AttributeName
tbl.ProductAttribute :
public int Id
public string
当我巧巧地为两个外键插入具有相同值的int ProductId
int AttributeId
string Value
时,会抛出异常:
我刚刚想到了一种解决方法,可以在tbl.ProductAttribute
tbl.ProductAttribute
然后将其设置为主键,并使用int ProductAttributeId
,ProductId
作为外键。但这是解决这个问题的方法吗?如果是这样,有没有更好的方法可以解决此问题而无需更改代码?
答案 0 :(得分:1)
您的ProductAttribute
表是多对多连接表,其中ProductId
和AttributeId
是该表的组合主键。因此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
,AttributeId
的集合可以重复,但是ProductId
,AttributeId
和Value
的集合应该是唯一的,您的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)。您可以为外键创建非唯一索引,以提高运行联接时的性能。