我试图用实体框架的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; }
}
为什么抛出这个错误以及我能用它做什么?
答案 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; }
}