外键查询下拉列表EF 6

时间:2014-02-14 20:11:07

标签: asp.net entity-framework drop-down-menu webforms entity-framework-6

我一直在谷歌搜索3天,找不到可用的答案,我希望有人可以帮助我。

我从这个优秀的教程开始:

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

我正在尝试扩展此项目,以允许“学年”查找数据库中的另一个表,而不是枚举。令我惊讶的是,找到一个使用.net 4.5,VS 2013,EF 6和动态字段来说明这一点的例子是多么困难。

所以,这就是我所做的:

1)在数据库中添加了一个名为“Years”的新表(YearID tinyint PK,YearName varchar)。使用可能的值填充该表。

2)为了保持一致性,将学生从年份重新命名为YearID,我将其更改为tinyint,在Students.YearID和Years.YearID

之间建立了关系。

3)更改了SchoolContext以包含新表:

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

4)添加了Year类,如下所示:

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; }

是否需要类似的注释来告诉Dynamic控件从Years表中获取数据?就我所知,整件事情都是非常神秘和无证的。

我在某处读到你应该使用链接字段的名称,而不是其他什么,所以我将Dymanic字段上的DataField更改为“Year”,而不是“YearID”。当我这样做时,控件呈现“System.Data.Entity.DynamicProxies.Year_9D4E99 .........”。

当然,我的ForeignKey_Edit.ascx文件保持默认状态,即显示下拉列表。

我希望我在这里遗漏一些非常明显的东西。

谢谢

1 个答案:

答案 0 :(得分:1)

对于实体框架6,您必须为EF6安装&#34;动态数据提供程序&#34;:[http://blogs.msdn.com/b/webdev/archive/2014/02/28/announcing-该离型的动态数据提供者和 - 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中,您需要使用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将此方法添加到每个页面。