我想創建一個可選的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 initial
和Update-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)]
等,但無濟於事。
我沒有找到真正的問題/解決方案,而是改變了數據庫結構,以完全避免問題... – Laoujin