添加控制器时无法检索模型的元数据

时间:2016-09-28 03:32:07

标签: c# asp.net asp.net-mvc entity-framework asp.net-mvc-5

我正在“Visual Studio 2015社区”上学习ASP.NET MVC 5作为新手。我正在尝试添加一个带有Entity Framework模型的控制器。

enter image description here

出现错误。我很困惑。

enter image description here

这是我的代码:

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Web;

namespace TwiApp.Models
{
    public class Twilio
    {
        [Key]
        public int id { get; set; }
        public string userId { get; set; }
        public string sid { get; set; }
        public string authToken { get; set; }
        public string fromNumber { get; set; }
        public string toNumber { get; set; }
        public bool status { get; set; }
        [ForeignKey("userId")]
        public virtual ApplicationUser twi_appuser_ref { get; set; }
    }
}

我到SQL Server 2014的连接字符串:

<connectionStrings>
    <add name="DefaultConnection" connectionString="Data Source=localhost;Initial Catalog=TwiAppDB;Integrated Security=True"
  providerName="System.Data.SqlClient" />
</connectionStrings>

最后,我的databasecontext文件:

using Microsoft.AspNet.Identity.EntityFramework;
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Data.Entity.ModelConfiguration.Conventions;
using System.Linq;
using System.Web;
using TwiApp.Models;

namespace TwiApp.DAL
{
    public class DatabaseContext : IdentityDbContext<ApplicationUser>
    {
        public DatabaseContext() : base("DefaultConnection", throwIfV1Schema: false)
        {
        }

        public DbSet<Twilio> Twilio_Db { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {          
            modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
            base.OnModelCreating(modelBuilder);
        }

        public static DatabaseContext Create()
        {
            return new DatabaseContext();
        }
    }
}

到目前为止我尝试过:

  1. ASP.NET MVC/EF Code First error: Unable to retrieve metadata for model
  2. Unable to retrieve metadata - MVC application
  3. Unable to Retrieve Metadata
  4. MVC4 Scaffolding Add Controller gives error "Unable to retrieve metadata..."
  5. Cannot create controller with Entity framework - Unable to retrieve metadata for ' '
  6. 任何答案都会得到赞赏。谢谢。

6 个答案:

答案 0 :(得分:2)

这是由于Controller脚手架无法正确识别web.config文件中的连接字符串。

在Web.config中,将第二个providerName设置为与第一个providerName相同,并在创建控制器后,撤消该!

<connectionStrings>
    <add name="DefaultConnection" connectionString="Data Source=*.*.*.*;Database=database_name;uid=sa;pwd=******;" providerName="System.Data.SqlClient" /> 
</connectionStrings>

现在恢复原状

<connectionStrings>
    <add name="DefaultConnection" connectionString="Data Source=*.*.*.*;Database=database_name;uid=sa;pwd=******;" providerName="MySql.Data.MySqlClient" /> 
</connectionStrings>

答案 1 :(得分:1)

尝试更新你的Twilio Class,如下所示,EF将找出关键和关系:

 public class Twilio
{
    //  [Key]
    public int Id { get; set; }
    public string sid { get; set; }
    public string authToken { get; set; }
    public string fromNumber { get; set; }
    public string toNumber { get; set; }
    public bool status { get; set; }
    //   [ForeignKey("userId")]
    public string userId { get; set; }
    public virtual ApplicationUser ApplicationUser { get; set; }
}

答案 2 :(得分:0)

MVC 5 / EF 6

也许你可以在旧版本中做到这一点?

  1. 在web / app.config中注释掉连接字符串,然后保存
  2. 让VS创建一个“新的”dbcontext项目,而不是选择你已经拥有的项目
  3. 创建
  4. 删除新的dbcontext类
  5. 将控制器dbcontext替换为您的
  6. 在web / app.config中取消注释连接字符串,然后保存
  7. 为我工作!

答案 3 :(得分:0)

就我而言,数据上下文类缺少一些信息。对于任何有这个简单错误的人:

  1. 在“数据上下文类”字段中,我选择了“添加”按钮并创建了一个新的临时DbContext。 &#39;检索元数据&#39;错误没有弹出,脚手架被创建了。
  2. 然后我进入了新创建的&#34;临时&#34; DbContext并注意到我原来的DbContext中缺少一些自动生成的DbSet方法。将这些添加到原始的和重试的创建脚手架中并且它起作用。

答案 4 :(得分:0)

我想我只是遇到了同样的错误: enter image description here

我的案例中的原因是我的Part模型:

public int OperationSetId { get; set; }
[ForeignKey("OperationSetId")]
public OperationSet OperationSet { get; set; }

因为我使用:

创建了我的数据库
enable-migrations
add-migration initial
update-database

在控制台中,我的IdentityModels.cs中的表格并没有为我自动生成(就像我运行程序时一样)。

要修复我插入此行的错误:

public DbSet<OperationSet> OperationSet { get; set; }

ApplicationDbContext类

底部的 IdentityModels.cs

根据您的需求调整此代码后,您需要:

 add-migration migrationTitle
 update-database

在你的控制台中。现在你应该能够制作控制器,因为你的模型没有引用一个不存在的表!

答案 5 :(得分:0)

您需要添加相反的关系来创建类似的控制器

ICollection<Twilio> twilio

在ApplicationUser类中。