EF6:复合主键字段作为外键(ALTER TABLE语句与FOREIGN KEY约束冲突)

时间:2015-04-02 04:08:19

标签: entity-framework foreign-keys composite-primary-key entity-framework-6.1

我正在尝试使用复合主键中的一个字段作为链接到另一个实体的外键。

public class Security
{
    [Key]
    [MaxLength( 20 )]
    public string Symbol { get; set; }
}

public class Price
{
    [Key, Column( Order = 1 )]
    [MaxLength( 20 )]
    [Required]
    public virtual string Symbol { get; set; }

    [Key, Column( Order = 2 )]
    public DateTime AsOf { get; set; }

    [ForeignKey("Symbol")]
    public virtual Security Security { get; set; }
}

当我添加迁移/更新数据库时,我收到以下错误消息:

ALTER TABLE [dbo].[Prices] 
ADD CONSTRAINT [FK_dbo.Prices_dbo.Securities_Symbol] 
FOREIGN KEY ([Symbol]) 
REFERENCES [dbo].[Securities] ([Symbol]) 
ON DELETE CASCADE 
  

System.Data.SqlClient.SqlException(0x80131904):ALTER TABLE语句与FOREIGN KEY约束“FK_dbo.Prices_dbo.Securities_Symbol”冲突。冲突发生在数据库“FitchTrust”,表“dbo.Securities”,列'符号'。

仅供参考,我在最初创建Price后将Security属性添加到Price。不知道是否可能导致了这个问题。

是否可以将复合主键中的一个字段用作外键?如果是这样,我该如何配置(最好通过注释,但也可以使用流畅的API)。

1 个答案:

答案 0 :(得分:2)

这是一个Sql错误,它与现有数据有关。这意味着新外键引入的参照完整性已被违反,即dbo.Prices.Symbol中至少有一个符号值dbo.Securities.Symbol中不存在。查找罪魁祸首,将行添加到dbo.Securities,或将其从dbo.Prices

中删除

查找:

SELECT * 
FROM dbo.Prices p
WHERE NOT EXISTS
(SELECT 1 
 FROM dbo.Securities s
 WHERE s.Symbol = p.Symbol);

插入证券(可能会有其他栏目需要在其他地方采购)

INSERT INTO dbo.Securities(Symbol)
  SELECT p.Symbol
  FROM dbo.Prices p
  WHERE NOT EXISTS
    (SELECT 1 
     FROM dbo.Securities s
     WHERE s.Symbol = p.Symbol);

或从价格中删除:

DELETE
FROM dbo.Prices p
WHERE NOT EXISTS
(SELECT 1 
 FROM dbo.Securities s
 WHERE s.Symbol = p.Symbol);