Почему MVC3 не защищает мои столбцы внешнего ключа - PullRequest
2 голосов
/ 12 июня 2011

Я пытаюсь использовать 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, на которые ссылается руководство. Я уверен, что выполнил все шаги ...

Куда я иду не так / Что мне не хватает?

1 Ответ

8 голосов
/ 29 июня 2011

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

Мое лучшее предположение о том, почему это не сработало в вашем случае, заключается в том, что, возможно, вы пропустили свойство 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; }
}

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

...