2017-08-02 60 views
2

我正在嘗試爲實體框架創建控制器。作爲模型類我將使用產品類別:控制器創建時無法檢索元數據

public class Product 
{ 
    public int ProductId { get; set; } 
    public int CategoryId { get; set; } 
    public int ManufacturerId { get; set; } 
    public string Name { get; set; } 
    public string Description { get; set; } 
    public decimal Price { get; set; } 
    public string PhotoUrl { get; set; } 
    public Category Category { get; set; } 
    public Manufacturer Manufacturer { get; set; } 
} 

而像數據上下文類這樣的:

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

的問題是,我試圖創建控制器「無法檢索時,得到一個錯誤'RetroGadget.Models.Product'的元數據「。 據我瞭解,當代碼生成器試圖創建強類型的視圖時,它實際上是拋出,但我不明白爲什麼。

UPD: 這是我的Web.config。

<connectionStrings> 
    <add name="RetroGadgetCon" connectionString="Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=RetroGadget.Models.RetroGadgetEntities;Integrated Security=True;" providerName="System.Data.SqlClient"/> 
    </connectionStrings> 
    <entityFramework> 
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework"> 
     <parameters> 
     <parameter value="mssqllocaldb" /> 
     </parameters> 
    </defaultConnectionFactory> 
    <providers> 
     <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> 
    </providers> 
    </entityFramework> 

UPD2

public class Product 
{ 
    [Key] 
    public int ProductId { get; set; } 
    public int CategoryId { get; set; } 
    public int ManufacturerId { get; set; } 
    public string Name { get; set; } 
    public string Description { get; set; } 
    public decimal Price { get; set; } 
    public string PhotoUrl { get; set; } 
    [ForeignKey("CategoryId")] 
    public Category Category { get; set; } 
    [ForeignKey("ManufacturerId")] 
    public Manufacturer Manufacturer { get; set; } 
} 

爲什麼這個錯誤時,拋出什麼我可以做什麼呢?

+0

您是否試圖通過腳手架模型類使用Code First到控制器?你能否提供web.config內容來分析可能的錯誤? –

+0

@TetsuyaYamamoto將其添加到UPD部分。 – Gleb

回答

0

好吧,我心中已經解決了這個問題。 實際的問題是鏈接的類。

public class Category 
{ 
    [Key] 
    public int CategoryId { get; set; } 
    public string Name { get; set; } 
    public string Description { get; set; } 
    public List<Product> Products { get; set; } 
} 

public class Manufacturer 
{ 
    [Key] 
    public int ManufacturerId { get; set; } 
    public string Name { get; set; } 
} 

問題是,有在製造商類沒有現場的產品。所以我改變了這個。

public class Manufacturer 
{ 
    [Key] 
    public int ManufacturerId { get; set; } 
    public string Name { get; set; } 
    public List<Product> Products { get; set; } 
} 
1

以下是可能的解決方法,你可以這樣做:

1)如果您使用的Code First &錯誤信息表明實體「X」沒有定義EntitySet的「X」鍵是基於輸入「Y」不具有定義鍵,添加主鍵屬性(KeyAttribute),以用作標識列類屬性建模:

using System.ComponentModel.DataAnnotations; 

public class Product 
{ 
    [Key] // add this attribute 
    public int ProductId { get; set; } 

    // other properties 
} 

此外,確保DbContext構造包含引用命名連接字符串在web.config中:

public class RetroGadgetEntities : DbContext 
{ 
    public RetroGadgetEntities() : base("RetroGadgetCon") 
    { 
    } 

    public DbSet<Product> Products { get; set; } 
    public DbSet<Category> Categories { get; set; } 
} 

此後,確保所有外鍵&表之間的關係被精心佈置(添加ForeignKeyAttribute & ICollection如果需要的話)。

2)如果錯誤消息指示無法識別的元素 '提供商',這provider在幅材部分。配置可能從一個模型創建控制器當EF方面造成問題的元數據(當你降級使用模板前一個默認的EF版本經常出現):

<providers> 
    <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> 
</providers> 

嘗試移除provider一部分,使得entityFramework節成爲本:

<entityFramework> 
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework"> 
     <parameters> 
     <parameter value="mssqllocaldb" /> 
     </parameters> 
    </defaultConnectionFactory> 
</entityFramework> 

注:連接字符串部分似乎使用了無效的數據庫位置命名空間RetroGadget.Models.RetroGadgetEntities,請嘗試更改Initial Catalog使用數據庫名稱,而不是:

<add name="RetroGadgetCon" connectionString="Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=(database name);Integrated Security=True;" providerName="System.Data.SqlClient"/> 

如果仍不給定LocalDB實例工作的連接,添加AttachDbFilename="(database path)\(database name).mdf" &使用Data Source=(LocalDb)\v11.0(視的LocalDB版本,請參閱SQL Server connection string)。

參考文獻:

Cannot create controller with Entity framework - Unable to retrieve metadata for ' '

Entity Framework: Unrecognized element 'providers' exception

+0

謝謝,但沒有任何工作。 'RetroGadget.Models.RetroGadgetEntities'是實際的數據庫名稱(由EF創建)。此外,我還提到,錯誤消息不會指示任何內容,只是'無法檢索'RetroGadget.Models.Product'的元數據,僅此而已。 – Gleb

+0

我不確定錯誤在「無法提供X的元數據」後面是否包含任何內容。你能否提供更多的細節和/或錯誤的截圖?您的'Product'類也沒有定義數據註釋,可能錯誤來自它。 –

+0

你需要什麼datails?我可以提供一個截圖,但它是俄語。但沒有什麼更多,只是我提供的錯誤文本。 – Gleb

相關問題