3

我正在從一個預先存在的數據庫讀取數據(不需要編寫)的Core MVC項目。不幸的是,這個數據庫是一團糟,但我無法改變它的任何內容(即使我可以,我也不會用10英尺的杆子碰它)。我應該如何爲現有數據庫表定義複合主鍵?

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

  • 該表沒有任何外鍵關係彼此,並且包含會最好已經進入到一個子表數據;誰創建數據庫似乎已經使用表,就好像它們是Excel電子表格一樣。
  • 沒有定義主鍵或外鍵。
  • 表和列的名稱似乎是包含的數據的首字母(對於虛擬示例,通常將名稱爲「Customer」的表替換爲「Database - Business Customer」的名稱爲「dbbc」)。
  • 表格不在「dbo」模式中。

不過,我不得不從這個數據庫中讀取數據,並希望使用實體框架來這樣做。

該數據庫託管在SQL Server 2008 R2

我可以通過使用諸如[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: The entity type 'MyProject.Models.Order' requires a primary key to be defined.

有什麼更多的,我可以添加,使實體框架此表的工作?

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

回答

8

你的配置在EF6下正常工作。但是在EF核心中使用數據註釋時一定要小心(看起來Fluent API將是首選的方法)。

文檔的Keys(primary)部分明確規定:

You can also use the Fluent API to configure multiple properties to be the key of an entity (known as a composite key). Composite keys can only be configured using the Fluent API - conventions will never setup a composite key and you can not use Data Annotations to configure one.

讓您真正需要使用:

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