1

我有 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; }
    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”列中。

我在这里做错了吗?我真正想做的是将 My 映射TicketAdminUserProfileid ( UserProfile.UserId = TicketAdmin.Id)

谢谢你的时间!

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

4

4 回答 4

6

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

  • 包含外键(Ticket_Admins在这种情况下)的表必须为空,或者
  • 外键列之前存在,并且该列中的每个值都包含相关实体的有效键
于 2013-02-26T11:04:46.670 回答
2

好的,我发现我需要的只是将 ForeignKey 设置为:

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

就这样。现在外键生成正确。

于 2013-02-26T12:51:24.100 回答
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

于 2013-02-26T11:07:27.000 回答
0

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

于 2014-01-20T02:50:02.393 回答