ADD CONSTRAINT与EF失败

时间:2013-11-05 23:32:30

标签: asp.net entity-framework entity-framework-5 ef-migrations

尝试通过EF Code-First将另一个FK添加到现有表中。

Fluent API:

  modelBuilder.Entity<Relationship>()
       .HasRequired(c => c.Area)
       .WithMany(d => d.Relationships)
       .HasForeignKey(u => u.AreaId);

关系类包含:

    [Required]
    public virtual Area Area { get; set; }
    public int AreaId { get; set; }

区域类包含:

    public virtual ICollection<Relationship> Relationships { get; set; }

PM控制台的输出:

  ALTER TABLE [dbo].[Relationship] ADD [AreaId] [int] NOT NULL DEFAULT 0
  ALTER TABLE [dbo].[Relationship] ADD CONSTRAINT [FK_dbo.Relationship_dbo.Area_AreaId] FOREIGN KEY ([AreaId]) REFERENCES [dbo].[Area] ([AreaId])

首先,Area_AreaId是什么?

其次,如何知道是在关系实体,区域实体还是两者上设置Fluent API?

我得到的错误:

  

ALTER TABLE语句与FOREIGN KEY约束冲突   “FK_dbo.Relationship_dbo.Area_AreaId”。冲突发生在   数据库“db”,表“dbo.Area”,列“AreaId”。

发生了什么事?

1 个答案:

答案 0 :(得分:1)

Relationship.AreaId中有一个Area.AreaId中没有AreaId中不存在的值,因此无法应用FK约束。

在上一个语句中,您将Relationship列添加到0表并设置了默认值AreaId。任何现有行都会将0设置为Area.AreaId。然后你试图添加外键约束,但我敢打赌你没有0 public int? AreaId { get; set; } 来满足它。

也许,如果区域是关系的可选区域,你可以在类中使它可以为空吗?

{{1}}

我想这会导致EF产生一个可以为空的列,因此默认值为0。