2011-06-12 22 views
2

我試圖使用MVC 3與EF 4.1使用代碼第一,我跟隨斯科特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爲什麼MVC3不腳手架我的外鍵列

我遇到的問題是,當我創建產品控制器和相關的腳手架視圖時,沒有在任何視圖中創建「類別」列(「編輯」,「創建」,「索引」等),根據教程應該創建。

我追溯了列未顯示的原因是因爲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

我認爲這個教程可能是錯誤的,因爲我從來沒有見過MVC 3腳手架使用DB First自動創建導航屬性,無論是否使用SP1或MVC工具更新。 – Tridus 2011-06-12 03:35:56

回答

8

我相信它的工作方式與本教程中描述的一樣 - 我剛剛瀏覽了該教程並獲得了預期的結果(它支持「類別」列和下拉列表)。

我最好的猜測是爲什麼它在你的情況下不起作用,或許你錯過了Product類的CategoryID屬性,或者你可能稱之爲別的東西。對於腳手架檢測FK關係,您的實體有必要同時擁有「導航」屬性(在此例中爲Category,類型爲Category)和「外鍵」屬性(在此例中爲類型爲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; } 
} 

記得使用「添加控制器」窗口之前編譯代碼,否則不會意識到你已經改變了代碼。

+1

謝謝史蒂文那是問題,我有一個類型屬性錯字 – nzkarl 2011-06-29 19:55:14

相關問題