控制器创建时无法检索元数据

时间:2017-08-02 11:28:19

标签: asp.net asp.net-mvc entity-framework entity-framework-6

我试图用实体框架的vies创建控制器。作为模型类,我将使用Product class:

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; }
}

问题是我在尝试创建控制器时遇到错误&#34;无法检索&#39; RetroGadget.Models.Product&#39;&#34;的元数据。 据我所知,当代码生成器试图创建强类型视图时,它会被抛出,但我无法弄清楚原因。

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; }
}

为什么抛出这个错误以及我能用它做什么?

2 个答案:

答案 0 :(得分:1)

以下是您可以执行的修复:

1)如果你正在使用Code First&amp;错误消息指示实体'X'没有定义键实体集'X'基于没有定义键的类型'Y',添加主键属性({{ 1}})模拟用作标识列的类属性:

KeyAttribute

此外,请确保using System.ComponentModel.DataAnnotations; public class Product { [Key] // add this attribute public int ProductId { get; set; } // other properties } 构造函数包含对web.config中命名连接字符串的引用:

DbContext

之后,确保所有外键&amp;表关系安排得很好(如果需要,请添加public class RetroGadgetEntities : DbContext { public RetroGadgetEntities() : base("RetroGadgetCon") { } public DbSet<Product> Products { get; set; } public DbSet<Category> Categories { get; set; } } &amp; ForeignKeyAttribute

2)如果错误消息指示无法识别的元素'提供商',则web.config中的此ICollection部分可能会在创建控制器时导致EF上下文出现元数据问题从模型中(通常在您将模板使用的默认EF版本降级到之前版本时):

provider

尝试删除<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

如果连接仍无法与给定的LocalDB实例一起使用,请添加<add name="RetroGadgetCon" connectionString="Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=(database name);Integrated Security=True;" providerName="System.Data.SqlClient"/> &amp;使用AttachDbFilename="(database path)\(database name).mdf"(取决于LocalDB版本,请参阅SQL Server connection string)。

参考文献:

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

Entity Framework: Unrecognized element 'providers' exception

答案 1 :(得分:1)

好的,我解决了。 实际问题是链接类。

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; }
}