EF外键迁移会引发错误

时间:2013-02-26 10:40:25

标签: c# entity-framework-5

我有两张桌子:

[Table("Ticket_Admins")]
public class TicketAdmin
{
    public TicketAdmin()
    {
        Name = new Record();
        Name.IsRevisioned = false;
        Name.IsVisible = true;
        Name.Category = typeof(TicketAdmin).Name;
    }
    [Key]
    public int Id { get; set; }
    public virtual Record Name { get; set; }
    public virtual TicketPost Post { get; set; }
    public virtual UserProfile User { get; set; }
}

[Table("UserProfile")]
public class UserProfile
{
    private string _email;

    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]       
    public int UserId { get; set; }
    public string Email 
    {
        get { return _email; }
        set { _email = value.ToLower(); }
    }
}

并将其映射到上下文中:

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<TicketAdmin>()
            .HasRequired(x => x.User)
            .WithRequiredPrincipal();
        base.OnModelCreating(modelBuilder);
    }

但是在迁移方面我遇到了错误:

  

ALTER TABLE语句与FOREIGN KEY约束“FK_dbo.UserProfile_dbo.Ticket_Admins_UserId”冲突。冲突发生在数据库“aspnet-BoomzHelperPortal-dbv3”,表“dbo.Ticket_Admins”,列'Id'。

我在这里做错了吗?我正在尝试做的是通过ID(TicketAdmin)将UserProfile映射到UserProfile.UserId = TicketAdmin.Id

感谢你的时间!

更新: 我刚尝试创建一个空数据库,这个shema发现它使UserProfile.UserId成为一个外键列,但我需要的是TicketAdmin.Id成为FK列。 (就像所有用户都有UserProfile一样,但并非每个人都有TicketAdmin设置,而且TicketAdmin是UserProfile的子级,并且具有与UserProfile ID相同的ID。)

4 个答案:

答案 0 :(得分:5)

如果要添加必需的关系(不可为空的外键),则必须满足下列条件之一:

  • 包含外键(在本例中为Ticket_Admins)的表必须为空,或
  • 之前存在的外键列,并且所述列中的每个值都包含相关实体的有效键

答案 1 :(得分:2)

这是因为您要向已包含与此约束不匹配的数据的表添加外键。尝试删除数据(如果可能)或修改数据以适应约束,否则,您需要修改约束

此外,您似乎尝试在两个主键之间添加外键,我不知道是否可能,请考虑修改Ticket_Admins表以包含UserId字段:

[Table("Ticket_Admins")]
public class TicketAdmin
{
    public TicketAdmin()
    {
        Name = new Record();
        Name.IsRevisioned = false;
        Name.IsVisible = true;
        Name.Category = typeof(TicketAdmin).Name;
    }
    [Key]
    public int Id { get; set; }
    public int UserId { get; set; }
    public virtual Record Name { get; set; }
    public virtual TicketPost Post { get; set; }
    public virtual UserProfile User { get; set; }
}

然后在UserProfile.UserId = Ticket_Admins.UserId

之间创建一个外键

答案 2 :(得分:2)

好的,我发现我需要的是设置外键,如:

[Table("Ticket_Admins")]
public class TicketAdmin
{
    public TicketAdmin()
    {
        Name = new Record();
        Name.IsRevisioned = false;
        Name.IsVisible = true;
        Name.Category = typeof(TicketAdmin).Name;
    }
    [Key]
    public int Id { get; set; }
    public virtual Record Name { get; set; }
    public virtual TicketPost Post { get; set; }
    [ForeignKey("UserId")]
    public virtual UserProfile User { get; set; }
}

这就是全部。现在正确生成了外键。

答案 3 :(得分:0)

如果您尝试为Existence表创建新的外键,  您需要删除存在表中的所有数据。由于每条记录都需要有一个外键,而有些记录已经创建,但没有外键。