3

使用實體框架5Visual Studio 2010中實體框架電動工具(測試版2)擴展。實體框架5 - 無效的列名 - 逆向工程的Code First

這裏是我的數據庫表結構:

Database Table Structure

我用上述擴展的逆向工程代碼第一次功能,其產生的POCO類和一些「映射」文件(不知道這是正式的說法)和一個DbContext派生類。除了接下來我要描述的改變之外,所有這些生成的類都是由電動工具生成的。

在Category.cs文件,添加以下代碼,以幫助拉平對象圖位:

private ICollection<Product> m_Products = null; 
public ICollection<Product> Products 
{ 
    get 
    { 
     if (m_Products == null) 
     { 
      m_Products = new List<Product>(); 
      foreach (var categoryProduct in CategoryProducts) 
      { 
       m_Products.Add(categoryProduct.Product); 
      } 
     } 
     return m_Products; 
    } 
    set { m_Products = value; } 
} 

我得到下面的異常,我知道一定有事情做與映射,但我不能完全弄明白這一點。

Unhandled Exception: System.Data.EntityCommandExecutionException: An error occurred while 
executing the command definition. See the inner exception for details. 
---> System.Data.SqlClient.SqlException: 
     Invalid column name 'Category_CategoryId'. 

如果我需要發佈更多的信息,如映射的具體信息,請讓我知道,我會做。我想盡可能縮短這個時間,但是我意識到我已經省略了一些對於那些不熟悉該工具生成的代碼的人來說可能會留下一些需要更多細節的事情。

回答

6

您已經將模型的導航屬性添加到模型中,因此EF試圖將其映射到您的數據庫。 「代碼優先」意味着你的代碼模型定義了你的數據庫模式。

嘗試將[NotMapped]屬性添加到您的助手屬性中,以告知EF忽略它們。

+0

你在哪裏。謝謝,我很感激。這給了我一個很好的起點,從中進一步研究爲什麼這會導致我的問題。謝謝! –

+0

不客氣:) –

2

如果您已經自動創建了數據庫方案,並且您沒有使用像(DropDatabaseAlways/DropDatabaseIfModelChanges)這樣的策略 - 換言之:您確實在逆向工程中,似乎您必須在「類別「表。

在情況下,你不想與屬性(我指的是DB)工作,你可以使用數據標註[NotMapped]或流利的API modelBuilder.Entity<Category>().Ignore(x=> x.CategoryId)

最後有可能是問題可以在映射。我不知道您是使用數據註釋還是Fluent API,但EF可能會自動查找某些數據庫列(邏輯行爲來自模型)並找不到它。在這種情況下,我建議您對映射進行修改。

+0

感謝您的回覆,我很感激! –

0

OP已經解決了他們的問題,但是我有一個類似的錯誤與不同的解決方案。所以在這種情況下,其他人需要它:

我在實體之間0..1關係的一側缺少導航屬性。一旦我添加了一個適當的導航屬性到缺少它的實體,問題就解決了。

更多的細節:我有兩個使用FK的0..1關係的實體。實體A(父)具有FK到實體B(子)。子實體B具有對實體A的導航屬性,但A確實對而不是具有對B的導航屬性。添加完後,問題得以解決。

+1

糾正我,如果我錯了,但導航屬性並不需要雙方爲了定義關係...導航屬性必須至少在一側。所以,我認爲,必須有解決方案,不需要在雙方添加導航屬性(或使EF忽略/不映射此導航) – Prokurors

相關問題