2011-11-21 102 views
0

我正在考慮使用EF作爲項目,我將在未來幾周內開始。使用實體框架映射兩個以上的表

我在以前創建的數據庫中有三個表。 (請參閱附圖)EDMX

當創建CompanyNotice記錄時,必須將至少一個位置(從位置表中)添加到CompanyNoticeLocations表中。

例如

**CompanyNotice** 
ID CompanyID Date      Heading Text ..... 
2 9   2011-11-21 10:17:29.573 Lorem Ipsum 1 1 1 

**CompanyNoticeLocations** 
CompanyNoticeLocationsID CompanyNoticeID LocationID 
1      2    4 
2      2    5 
3      2    1 

主要問題: 誰能告訴我,如果我可以使用EF創建一個實體,稱爲:CompanyNoticesWithLocations剛剛返回:

  • 標題
  • 文本
  • 名單LocationNames

子問題:我曾嘗試沒有多表實體映射與LINQ這樣做,我不能得到那個工作之一:

using (var context = new ALEntities()) 
       { 
        var query = from c in context.CompanyNotices.Include("Locations") 
           select new 
           { 
            c.CompanyNoticeHeading, 
            c.CompanyNoticeText, 
            (from l in c.CompanyNoticesLocations select l.Location.LocationName) 
           }; 
        ASPxGridView1.DataSource = query; 
        ASPxGridView1.DataBind(); 



       } 

不過,我得到一個錯誤:

Invalid anonymous type member declarator. Anonymous type members must be declared with a member assignment, simple name or member access.

+0

如果你做.toList到內部SELECT子句?我不知道該集合的屬性名稱是什麼... –

+0

我仍然收到無效的匿名類型錯誤。我也嘗試了內部select的LINQ .Aggregate(),並且我得到了同樣的錯誤信息。 – Seany84

回答

1

Your CompanyNoticesLocation表不需要在模型中作爲單獨的實體存在。這應該表現爲公司通告與地點之間的多對多協會。只要關聯設置正確,EF會將其映射到您可以在Mapping窗口中看到的基礎連接表。

下面是我自己的模型顯示協會映射到名爲CandidateAnswer底層連接表一個多對多的映射的例子:

enter image description here

+0

我明白你在這裏提出的建議。但是,當我從模型/圖中刪除'CompanyNoticeLocations'時,我無法再看到實體的映射細節。我如何創建這種多對多的關係?謝謝 – Seany84

+1

右鍵單擊CompanyNotice或Location實體並創建一個名爲CompanyNoticesLocation的關聯。然後,您可以在屬性窗口(F4)中將其設置爲多個。 –

+0

您可能對我關於EF的其他問題感興趣:http://stackoverflow.com/questions/8228101/aggregating-one-side-of-a-many-to-many-and-bind-to-gridview -in實體框架 – Seany84

1

這對我的作品

var query = from c in context.CompanyNotices.Include("Locations") 
           select new 
           { 
            c.CompanyNoticeHeading, 
            c.CompanyNoticeText, 
            locations = (from l in c.CompanyNoticesLocations select l.Location.LocationName) 
          }; 

其中位置將您的匿名類型的屬性的名稱..

+0

當我使用這個在我的gridview列輸出顯示爲「System.Collections.Generic.List'1 [System.String]」下的位置,而不是實際位置的列表。 – Seany84

+0

在這種情況下創建的匿名類型將是屬性名稱爲companynoticeheading,companynoticetext和字符串colllection的類,因此您的網格視圖將需要另一箇中繼器類型控制。 –