2014-07-08 79 views
0

我正在開發一個使用實體框架的winform應用程序。這是我的.edmx類圖由實體框架生成的意外財產

enter image description here

當我從這個查詢獲取數據

var empQuery = from emp in db.Publishers 
         select emp; 
List<Publisher> pubList = empQuery.ToList(); 
dataGridView1.DataSource = pubList; 

命名列書還回來。我想阻止它。請給我一個建議。我是Entity Framework的新手。

+0

每個'發佈者'必須包含'BOOKs',那麼問題是什麼? – DavidG

+0

是的,因爲你在Publisher和BOOK之間增加了一個關係,你的查詢將返回 –

+2

你只是不想在你的datagridview中顯示'BOOKs'? – DavidG

回答

3

假設您不希望在datagridview中顯示BOOKs列,則需要手動指定那裏的列或返回不同的類型。您可以使用這樣的匿名類型:

var empQuery = (from emp in db.Publishers 
       select new 
       { 
        emp.Id, emp.Name, emp.Year 
       }).ToList(); 
dataGridView1.DataSource = empQuery; 
+0

請問我可以告訴我如何添加一個部分到這個? –

+0

@HasankaRathnayake類似這樣的:'從emp在db.Publishers emp.Id == 5選擇新{...}' – DavidG

+0

非常感謝DavidG。 –

-1

Books屬性不代表數據庫列,它代表關係Publisher和Book,幷包含Books表中的相關書籍(這些書籍通常是延遲加載的)。

這就是EF(和其他ORMs)的工作原理。你可以編輯你的模型,並刪除兩者之間的關係,但如果你這樣做,你沒有利用EF的關鍵功能之一。

我的建議是將域模型保持原樣(因爲它是正確的)並更新Gridview的列,以便不顯示該屬性。

+0

downvoter會不會添加建設性的批評? – Liath

4

導航屬性根據您的表格關係自動生成。如果你不想要財產,你可以簡單地從EDMX中刪除它。

但是,請記住,導航屬性通常是延遲加載,這意味着即使此屬性存在,它將不會實際包含任何數據,直到它被訪問。

0

「列書籍」不是列,它是導航屬性。在這種情況下,它是與當前Publisher實體相關的Book實體的集合。 我認爲你在DataGrid中獲得了這一列的BOOKS,因爲你沒有在datagridView1中指定你想要顯示的列。 請記住,如果在數據網格中使用AutogenerateColumns標誌(http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.datagrid.autogeneratecolumns%28v=vs.110%29.aspx),則數據網格將爲數據源集合中的實體的每個屬性呈現一列。 更具體地說,我需要知道你在哪裏工作的場景(ASP.NET,Silverlight等)