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

Asp.net 创建控制器时无法检索元数据,asp.net,asp.net-mvc,entity-framework,entity-framework-6,Asp.net,Asp.net Mvc,Entity Framework,Entity Framework 6,我正在尝试使用VIE为实体框架创建控制器。作为模型类,我将使用产品类: 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 {

我正在尝试使用VIE为实体框架创建控制器。作为模型类,我将使用产品类:

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

为什么会抛出此错误以及我可以如何处理它?

以下是可能的修复方法:

1)如果您先使用代码&错误消息表明实体“X”未定义键,或者实体集“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; }
}
尝试删除该
提供程序
部分,使
entityFramework
部分变为:

<entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="mssqllocaldb" />
      </parameters>
    </defaultConnectionFactory>
</entityFramework>
如果连接仍然无法使用给定的LocalDB实例,请添加
AttachDbFilename=“(数据库路径)\(数据库名称).mdf”
&使用
数据源=(LocalDB)\v11.0
(取决于LocalDB版本,请参阅)

参考资料:

好的,我已经解决了。 实际问题在于链接类

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 int CategoryId{get;set;}
公共字符串名称{get;set;}
公共字符串说明{get;set;}
公共列表产品{get;set;}
}
公共类制造商
{
[关键]
public int-ManufacturerId{get;set;}
公共字符串名称{get;set;}
}
问题是,在制造商类别中并没有现场产品。所以我就这样改变了

public class Manufacturer
{
    [Key]
    public int ManufacturerId { get; set; }
    public string Name { get; set; }
    public List<Product> Products { get; set; }
}
公共类制造商
{
[关键]
public int-ManufacturerId{get;set;}
公共字符串名称{get;set;}
公共列表产品{get;set;}
}

您是否试图通过将模型类脚手架化到控制器来首先使用代码?您能提供web.config内容以分析可能的错误吗?@TetsuyaYamamoto将其添加到UPD部分。谢谢,但没有任何效果RetroGadget.Models.RetroGadgetEntities'是实际的数据库名称(由EF创建)。我还应该提到,错误消息没有表示任何内容,只是“无法检索”RetroGadget.Models.Product的元数据,仅此而已。我不确定错误是否在“无法为X提供元数据”之后不包含任何内容。您能否提供错误的其他详细信息和/或屏幕截图?另外,您的
产品
类没有定义任何数据注释,可能是因为它产生了错误。您需要什么数据说明?我可以提供一个截图,但它是在俄罗斯。但上面没有其他内容,只提供了错误文本。@Gleb通常任何错误消息都有与之相关的异常详细信息和堆栈跟踪。查看系统/应用程序事件日志以查看有关错误的详细信息,我认为在类似问题中仅提供主键属性就可以了。我添加了属性,您可以在UPD2中看到这一点。但也有同样的错误。此外,我还没有在应用程序事件日志中找到visual studio(或其组件)错误。
<entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="mssqllocaldb" />
      </parameters>
    </defaultConnectionFactory>
</entityFramework>
<add name="RetroGadgetCon" connectionString="Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=(database name);Integrated Security=True;" providerName="System.Data.SqlClient"/>
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; }
}