Поиск внешнего ключа Dropdownlist EF 6

asp.net drop-down-menu entity-framework entity-framework-6 webforms

Вопрос

Я работаю в поисковых системах в течение 3 дней и не могу найти полезный ответ, я надеюсь, что кто-то может мне помочь.

Я начинаю с этого ОТЛИЧНОГО учебника:

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) Переименовал поле в «Студенты с года в год» для согласованности, я изменил его на 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 control получить данные из таблицы Years? Насколько мне известно, все это очень загадочно и недокументировано.

Я где-то читал, что вы должны использовать имя связанного поля, а не что бы то ни было, поэтому я изменил DataField на поле Dymanic на «Year», а не на «YearID». Когда я это делаю, элемент управления отображается с помощью «System.Data.Entity.DynamicProxies.Year_9D4E99 .........».

Конечно, мой файл ForeignKey_Edit.ascx остается по умолчанию, чтобы показать выпадающий список.

Надеюсь, я пропустил нечто сверхъестественное здесь.

благодаря

Принятый ответ

Для инфраструктуры сущностей 6 вам необходимо установить «поставщик динамических данных для EF6»: [http://blogs.msdn.com/b/webdev/archive/2014/02/28/announcing-the-release-of-dynamic- данные-провайдера и-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 вам нужно будет использовать навигационное поле с идентификатором:

<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, который содержит навигационные поля.




Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему