3

我一直googling 3天,並找不到可用的答案,我希望有人可以幫助我。外鍵查找下拉列表EF 6

我開始與這個優秀的教程:

http://www.asp.net/web-forms/tutorials/data-access/model-binding/retrieving-data

我想延長這一項目讓「學年」要查找到另一個數據庫中的表,而不是一個枚舉。我驚訝地發現使用.net 4.5,VS 2013,EF 6和Dynamic字段來演示這個例子有多困難。

所以,這裏是我做了什麼:

1)增加了一個名爲 「歲月」 的新表的數據庫(YearID TINYINT PK,YearName VARCHAR)。用可能的值填充該表。

2)在重命名從年級學生YearID一致性領域中,我將其改爲TINYINT,創建Students.YearID和Years.YearID之間的關係

3)改變了SchoolContext以包括新的表:

public DbSet<Year> Years { get; set; } 

4)增加了年類,如下所示:

public class Year 
{ 
    public byte YearID { get; set; } 
    public string YearName { get; set; } 
    public virtual ICollection<Student> Students { get; set; } 
} 

5)學生類中刪除學年的東西,取而代之這些行:

public byte YearID { get; set; } 
public virtual Year Year { get; set; } 

6)變更的表單上的場,以顯示新鏈接YearID:

<asp:DynamicField DataField="YearID" /> 

(最後)的問題:YearID示出了作爲一個文本框,而不是一個下拉列表中,我無法弄清楚如何解決這個問題。當它是一個枚舉時它工作得很好,但作爲一個查找沒有好處。當它被定義爲一個枚舉,它有這樣的註釋:

[EnumDataType(typeof(AcademicYear)), Display(Name = "Academic Year")] 
    public AcademicYear Year { get; set; } 

有沒有告訴動態控制,從年表中獲取其數據所需的類似註解?據我所知,這整件事很神祕,沒有證件。

我在某處讀到你應該使用鏈接字段的名稱,而不是其他任何東西,所以我將Dymanic字段上的DataField更改爲「Year」,而不是「YearID」。當我這樣做時,控件呈現「System.Data.Entity.DynamicProxies.Year_9D4E99 .........」。

當然,我的ForeignKey_Edit.ascx文件保持默認狀態,即顯示下拉列表。

我希望我在這裏錯過了一些非常明顯的東西。

感謝

回答

1

對於實體框架6,您必須安裝「爲EF6動態數據提供商」:http://blogs.msdn.com/b/webdev/archive/2014/02/28/announcing -the-RELEASE-的動態數據提供者和 - entitydatasource控制換實體框架-6。ASPX] [1]

在Package-Manager控制檯運行:

Install-Package Microsoft.AspNet.DynamicData.EFProvider -Version 6.0.0 

註冊在的global.asax.cs型號爲動態數據

using System.Web.DynamicData; 

void Application_Start(object sender, EventArgs e) 
    {    
     MetaModel DefaultModel = new MetaModel(); 
     DefaultModel.RegisterContext(new Microsoft.AspNet.DynamicData.ModelProviders.EFDataModelProvider(
            () => new SchoolContext()), 
            new ContextConfiguration { ScaffoldAllTables = false }); 
    } 

在Students.aspx您需要使用導航領域insted的的ID:

<asp:DynamicField DataField="Year" /> 

添加這student.aspx.cs

using System.Web.DynamicData; 

protected void Page_Init() 
    { 
     MetaTable table = MetaTable.GetTable(typeof(Student)); 
     studentsGrid.SetMetaTable(table); 
    } 

您必須將此方法添加到包含導航字段的gridview或formview的每個頁面。

+0

謝謝,這對我們幫助很大,但現在「年」欄出現在gridview中作爲鏈接,我不知道這是從哪裏來的。我也不知道爲什麼這是如此複雜 - 這似乎是一個非常普遍的事情(提供從另一個實體的數據輸入字段的查找)。我錯過了什麼 - 是否有更好的方式爲用戶提供查找/下拉控件? – user3311566

+0

您可以自定義外鍵在datagrid中顯示的方式,以更改文件\ dynamicdata \ FieldTemplates \ ForeignKey.ascx。它實際上呈現爲超鏈接。您可以用標籤或文字替換它。 – motta

+0

hey @ user3311566它在Gridview中,默認爲只讀模式,在GridView或formview中添加autogenerateeditbuttons = true,然後單擊編輯,它會根據預期變成下拉菜單 –