2013-02-26 56 views
1

Ive得到了2個表:EF外鍵遷移拋出錯誤

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

但在遷移我收到錯誤:

The ALTER TABLE statement conflicted with the FOREIGN KEY constraint "FK_dbo.UserProfile_dbo.Ticket_Admins_UserId". The conflict occurred in database "aspnet-BoomzHelperPortal-dbv3", table "dbo.Ticket_Admins", column 'Id'.

上午我在這裏做錯了什麼?我正在嘗試做的是按地圖我的TicketAdminUserProfileUserProfile.UserId = TicketAdmin.Id

Thak you for your time!

UPDATE: 我剛嘗試創建一個空數據庫eith這瑪的發現,它使UserProfile.UserId一個外鍵列,但我需要的是TicketAdmin.Id成爲FK列。 (它與所有用戶都具有UserProfile一樣,但不是每個人都有TicketAdmin設置,並且TicketAdmin是UserProfile的子項,並且與UserProfile ID具有相同的ID)。

回答

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

而這就是全部。現在外鍵生成財產。

5

如果你想添加所需的關係(非空的外鍵),符合下列條件之一必須爲真:

  • 包含(在這種情況下Ticket_Admins)外鍵的表必須是空,或
  • 外鍵列之前就已經存在,在前述列中的每個值包含相關實體
+0

我在我的數據庫中沒有任何Ticket_Admins表...所以遷移需要創建它,但我在我的UserProfile表中有記錄 – CodeDemen 2013-02-26 11:12:42

2

有效的關鍵。這是因爲要添加一個外鍵,它已經包含一個表數據不匹配這個約束。嘗試刪除數據(如果可能)或修改數據以適應約束,否則,您需要修改約束

此外,它看起來像您試圖在兩個主鍵之間添加外鍵,我不知道這甚至有可能,可以考慮修改您的Ticket_Admins表,包括用戶ID字段:

[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

0

如果您嘗試爲存在表創建新的外鍵, 您需要刪除存在表中的所有數據。由於每個記錄都需要有外鍵,而有些記錄已經創建,但沒有外鍵。