2016-02-07 100 views
0

我想創建一個可選的1:兩個現有(傳統)表之間1映射,其中每個MainTable記錄可以或可以不具有 - 至多 - 一個SubTable記錄:EF - 1:1個關係不是主鍵

internal class MainTable 
{ 
    [Key] 
    public int Id { get; set; } 
} 
internal class SubTable 
{ 
    [Key] 
    public int Id { get; set; } 
    public int MainTableId { get; set; } 
} 

SubTable.Id並沒有真正起到任何作用,但最好它仍然是PrimaryKey和AutoGenerated,因爲遺留代碼仍在運行。

OnModelCreating獲取與更新:

modelBuilder.Entity<MainTable>() 
    .HasOptional(x => x.Sub) 
    .WithRequired(x => x.Main); 

通過上述模型,我跑Add-Migration initialUpdate-Database。然後我更新機型:

internal class MainTable 
{ 
    [Key] 
    public int Id { get; set; } 
    public SubTable Sub { get; set; } // new 
} 
internal class SubTable 
{ 
    [Key] 
    public int Id { get; set; } 
    public int MainTableId { get; set; } 
    public MainTable Main { get; set; } // new 
} 

運行Add-Migration創建了一個新的,但運行它提供了以下錯誤:Table 'dbo.SubTable' doesn't exist

生成的遷移:

public override void Up() 
{ 
    DropPrimaryKey("dbo.SubTable"); 
    AlterColumn("dbo.SubTable", "Id", c => c.Int(nullable: false)); 
    AddPrimaryKey("dbo.SubTable", "Id"); 
    CreateIndex("dbo.SubTable", "Id"); 
    AddForeignKey("dbo.SubTable", "Id", "dbo.MainTable", "Id"); 
} 

我不確定爲什麼EF想要刪除所有主鍵等,但最後一行似乎表明它想要綁定Sub.Id-> Main.Id,而它應該綁定Sub.MainTableId-> Main.Id。

之後,我試着用DataAnnotationAttributes來代替[ForeignKey],[Index("name", 1, IsUnique = true)]等,但無濟於事。

+0

我沒有找到真正的問題/解決方案,而是改變了數據庫結構,以完全避免問題... – Laoujin

回答

0

生病做這樣的事情

internal class MainTable 
{ 
    [Key] 
    public int Id { get; set; } 

    public virtual SubTable Sub { get; set; } // new 
} 
internal class SubTable 
{ 
    [Key] 
    public int Id { get; set; } 
    public int MainTableId { get; set; } 

    [ForeignKey("MainTableId")] 
    public virtual MainTable Main { get; set; } // new 
} 
+0

這給我:'無法確定委託人類型之間的關聯結束(沒有OnModelCreating)。或者:'多重性在'MainTable_Sub''關係中的角色'MainTable_Sub_Target'中無效(使用OnModelCreating) – Laoujin