我一直在谷歌搜索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文件保持默认状态,即显示下拉列表。
我希望我在这里遗漏一些非常明显的东西。
谢谢
答案 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将此方法添加到每个页面。