为什么MVC3不支持我的外键列

时间:2011-06-12 02:47:30

标签: asp.net-mvc-3 entity-framework-4.1 code-first

我正在尝试使用MVC 3和EF 4.1首先使用代码,并遵循Scott Guthries教程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 个答案:

答案 0 :(得分:8)

我相信它确实按照教程中的描述工作 - 我刚刚完成了该教程并获得了预期的结果(它确实支持了“类别”列和下拉列表)。

我最好猜测为什么它在你的情况下不起作用是你可能错过了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; }
}

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