Почему MVC3 не поддерживает столбцы внешнего ключа?

Я пытаюсь использовать MVC 3 с EF 4.1, сначала используя код, и следую учебнику Скотта Гатриса http://weblogs.asp.net/scottgu/archive/2011/05/05/ef-code-first-and-data-scaffolding-with-the-asp-net-mvc-3-tools-update.aspx.

Проблема, с которой я сталкиваюсь, заключается в том, что когда я создаю контроллер продуктов и связанные с ним каркасные представления, ни в одном из представлений не создается столбец «категория» («редактировать», «создавать», «индексировать» и т. д.), который в соответствии с учебником должны быть созданы.

Я выяснил, что причина, по которой столбец не отображается, связана с шаблонами t4... не удается проверить, является ли он привязываемым типом, чтобы отобразить свойство в виде столбца.

Логика проверки возможности привязки:

bool IsBindableType(Type type) {
return type.IsPrimitive || bindableNonPrimitiveTypes.Contains(type);
}

Где bindableNonPrimitiveTypes — фиксированный список:

static Type[] bindableNonPrimitiveTypes = new[] {
typeof(string),
typeof(decimal),
typeof(Guid),
typeof(DateTime),
typeof(DateTimeOffset),
typeof(TimeSpan),
};

Я только что установил VS2010 sp1, EF 4.1 и обновление инструментов MVC3, на которое ссылается учебник. Я уверен, что выполнил все шаги...

Где я ошибаюсь/Что я упускаю?


person nzkarl    schedule 12.06.2011    source источник
comment
Я думаю, что учебник может быть неверным в этом, потому что я никогда не видел, чтобы леса MVC 3 автоматически создавали свойства навигации с помощью DB First, либо с SP1, либо без обновления инструментов MVC.   -  person Tridus    schedule 12.06.2011


Ответы (1)


Я считаю, что это работает, как описано в учебнике - я только что прошел этот учебник прямо сейчас и получил ожидаемый результат (он создал столбец «Категория» и раскрывающийся список).

Мое лучшее предположение о том, почему это не сработало в вашем случае, заключается в том, что, возможно, вы пропустили свойство CategoryID из класса Product или, может быть, вы назвали его как-то иначе. Чтобы скаффолдинг обнаруживал связь FK, необходимо, чтобы ваша сущность имела как свойство «навигация» (в данном случае Category типа Category), так и свойство «внешнего ключа» (в данном случае CategoryID типа int) — без те, на которые он не будет выводить отношения, и, следовательно, вы не получите раскрывающийся список.

Если это поможет, вот полный код классов модели, который вы можете скопировать и вставить в свой проект:

public class Product
{
    public int ID { get; set; }
    public string Name { get; set; }
    public int CategoryID { get; set; }
    public decimal? UnitPrice { get; set; }
    public int UnitsInStock { get; set; }

    public virtual Category Category { get; set; }
}

public class Category
{
    public int CategoryID { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Product> Products { get; set; }
}

public class StoreContext : DbContext
{
    public DbSet<Product> Products { get; set; }
    public DbSet<Category> Categories { get; set; }
}

Не забудьте скомпилировать свой код перед использованием окна «Добавить контроллер», иначе он не поймет, что вы изменили код.

person Steven Sanderson    schedule 29.06.2011
comment
Спасибо, Стивен, это была проблема, у меня была опечатка в свойстве CategoryId. - person nzkarl; 29.06.2011