Asp.net mvc 3 为什么MVC3不能为我的外键列搭建脚手架

Asp.net mvc 3 为什么MVC3不能为我的外键列搭建脚手架,asp.net-mvc-3,entity-framework-4.1,code-first,Asp.net Mvc 3,Entity Framework 4.1,Code First,我正在尝试先使用代码将MVC 3与EF 4.1结合使用,并遵循Scott Guthries教程 我遇到的问题是,当我创建products controller和相关的脚手架视图时,在任何视图(“编辑”、“创建”、“索引”等)中都没有创建“类别”列,根据教程,这些视图都应该创建 我已经追查到该列未显示的原因是因为t4模板。。。为了将属性显示为列,检查它是否为可绑定类型失败 检查其是否可绑定的逻辑是: bool IsBindableType(Type type) { return type.IsPr

我正在尝试先使用代码将MVC 3与EF 4.1结合使用,并遵循Scott Guthries教程

我遇到的问题是,当我创建products controller和相关的脚手架视图时,在任何视图(“编辑”、“创建”、“索引”等)中都没有创建“类别”列,根据教程,这些视图都应该创建

我已经追查到该列未显示的原因是因为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),
};
我刚刚安装了VS2010SP1、EF4.1和本教程引用的MVC3工具更新。 我相信我已经遵循了所有的步骤


我哪里做错了/我遗漏了什么?

我相信它确实按照教程中所描述的那样工作-我刚刚完成了教程,并得到了预期的结果(它确实构建了一个“类别”列和下拉列表)

我对它为什么在您的案例中不起作用的最佳猜测是,可能您错过了
产品
类中的
CategoryID
属性,或者您将其称为其他名称。为了检测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; }
}
公共类产品
{
公共int ID{get;set;}
公共字符串名称{get;set;}
public int CategoryID{get;set;}
公共十进制?单价{get;set;}
public int UnitsInStock{get;set;}
公共虚拟类别{get;set;}
}
公共类类别
{
public int CategoryID{get;set;}
公共字符串名称{get;set;}
公共虚拟ICollection产品{get;set;}
}
公共类StoreContext:DbContext
{
公共数据库集产品{get;set;}
公共数据库集类别{get;set;}
}

记得在使用“添加控制器”窗口之前编译代码,否则它不会意识到您已经更改了代码。

我认为教程在这方面可能是错误的,因为我从未见过MVC 3脚手架首先使用DB自动创建导航属性,不管有没有SP1或MVC工具更新。感谢Steven,这就是问题所在,我在CategoryId属性中有一个输入错误