我應該如何為現有數據庫表定義復合主鍵?

composite-primary-key ef-database-first entity-framework entity-framework-core sql-server

我正在開發一個Core MVC項目,該項目從預先存在的數據庫中讀取數據(無需編寫)。不幸的是,這個數據庫是一團糟,但我不能改變其中的任何東西(即使我可以,我也不會用10英尺的桿子來觸摸它)。

數據庫的一些相關問題如下:

  • 這些表彼此之間沒有任何外鍵關係,並且包含最好輸入子表的數據;創建數據庫的人似乎使用了表,好像它們是Excel電子表格一樣。
  • 沒有定義主鍵或外鍵。
  • 表和列的名稱似乎是所包含數據的首字母(對於一個假想的示例,通常將名稱為“Customer”的表改為“dbbc”,而不是“Database - Business Customer”)。
  • 這些表不在“dbo”架構中。

然而,我被迫從該數據庫中讀取數據,並且更願意使用實體框架來執行此操作。

該數據庫託管在SQL Server 2008R2中

我可以通過使用[Table],[Column]和[Key]等屬性使用一個具有映射到實際列名稱的適當屬性名稱的類,使其在我必須使用的其中一個表上沒有問題。然而,另一張桌子被證明是一個問題。

此表沒有可以被視為主鍵的單個列,但我發現兩列的組合對於每一行都是唯一的,因此它們可以被視為複合主鍵(即使它們未被定義為這樣在數據庫中)。

我已經定義了一個類如下(我已經更改了名稱以隱藏此數據庫的標識,就像我想要的名字和恥辱):

[Table("dbbo", Schema = "schema")]
public class Order
{
    [Key]
    [Column("order", Order = 0)]
    public string OrderNo { get; set; }

    [Key]
    [Column("order_line", Order = 1)]
    public string OrderLineNo { get; set; }

    [Column("qty")]
    public double Quantity { get; set; }

    [Column("pr")]
    public double Price { get; set; }
}
  • 我已經為構成虛構複合主鍵的兩列添加了[Key]屬性。
  • 我已經為[Column]屬性的Order屬性添加了一個值,因為我讀到它是複合鍵所必需的。
  • 我只映射了我需要使用的列,因為該表的列數比該項目的列多10倍。

仍然,嘗試運行該項目會產生錯誤:

InvalidOperationException:實體類型“MyProject.Models.Order”需要定義主鍵。

我還可以添加更多內容以使此表與Entity Framework一起使用嗎?

編輯:我發現如果我在上下文的OnModelCreating方法中定義它,就像modelBuilder.Entity<Order>().HasKey(ord => new { ord.OrderNo, ord.OrderLineNo }); 。但是,如果可能的話,我仍然更願意單獨使用屬性。

一般承認的答案

您的配置適用於EF6。但是在使用EF Core的數據註釋時必須要小心(看起來像Fluent API將是那裡的首選方法)。

文檔的Keys(主要)部分明確指出:

您還可以使用Fluent API將多個屬性配置為實體的鍵(稱為複合鍵)。複合鍵只能使用Fluent API進行配置 - 約定永遠不會設置複合鍵,也不能使用數據註釋來配置複合鍵。

所以你真的需要使用:

modelBuilder.Entity<Order>().HasKey(e => new { e.OrderNo, e.OrderLineNo });


Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因