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

C# 添加控制器时无法检索模型的元数据,c#,asp.net,asp.net-mvc,entity-framework,asp.net-mvc-5,C#,Asp.net,Asp.net Mvc,Entity Framework,Asp.net Mvc 5,作为一名新手,我正在“Visual Studio 2015社区”上学习ASP.NET MVC 5。我正在尝试添加一个带有实体框架模型的控制器 然后出现一个错误。我很困惑 这是我的密码: using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using Syst

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

然后出现一个错误。我很困惑

这是我的密码:

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>



  • 任何答案都将被告知。谢谢。

    这是因为控制器支架无法正确识别web.config文件中的连接字符串

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

    i、 e

    
    
    现在恢复到原来的状态

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

    这是因为控制器支架无法正确识别web.config文件中的连接字符串

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

    i、 e

    
    
    现在恢复到原来的状态

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

    尝试更新您的Twilio类,如follow,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; }
    }
    

    尝试更新您的Twilio类,如follow,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; }
    }
    
    MVC 5/EF 6

    也许您可以在旧版本中执行此操作

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

    MVC 5/EF 6

    也许您可以在旧版本中执行此操作

  • 注释掉web/app.config中的连接字符串,然后保存
  • 让VS创建一个“新”dbcontext项,而不是选择您已经拥有的项目
  • 创造
  • 删除新的dbcontext类
  • 将控制器dbcontext替换为您的
  • 在web/app.config中取消注释连接字符串,然后保存

  • 为我工作

    在我的例子中,数据上下文类缺少一些信息。对于犯了这个简单错误的人:

  • 在数据上下文类字段中,我选择了add按钮并创建了一个新的临时DbContext。“检索元数据”错误未弹出,脚手架已创建
  • 然后,我进入了新创建的“临时”DbContext,注意到一些自动生成的DbSet方法在我的原始DbContext中丢失了。将这些添加到原始的并重试创建脚手架中,结果成功了

  • 在我的例子中,数据上下文类缺少一些信息。对于犯了这个简单错误的人:

  • 在数据上下文类字段中,我选择了add按钮并创建了一个新的临时DbContext。“检索元数据”错误未弹出,脚手架已创建
  • 然后,我进入了新创建的“临时”DbContext,注意到一些自动生成的DbSet方法在我的原始DbContext中丢失了。将这些添加到原始的并重试创建脚手架中,结果成功了

  • 我想我只是犯了同样的错误:

    在我的案例中,原因在于我的零件模型:

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

    在你的控制台里。现在您应该能够创建控制器了,因为您的模型没有引用不存在的表

    我想我也犯了同样的错误:

    在我的案例中,原因在于我的零件模型:

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

    在你的控制台里。现在您应该能够创建控制器了,因为您的模型没有引用不存在的表

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

    ICollection<Twilio> twilio
    
    i收集斜纹布
    

    在ApplicationUser类中。

    您需要添加相反的关系以创建类似

    ICollection<Twilio> twilio
    
    i收集斜纹布
    

    在ApplicationUser类中。

    您可能已经这样做了,但为了安全起见。您是否尝试过重建项目,然后再次尝试搭建脚手架?@haseebahmed7是的,我尝试过重建和清理项目,但都不起作用!您是否将web项目设置为启动项目?有时它只在启动项目中查找连接字符串。您可能已经这样做了,但为了安全起见。您是否尝试过重建项目,然后再次尝试搭建脚手架?@haseebahmed7是的,我尝试过重建和清理项目,但都不起作用!您是否将web项目设置为启动项目?有时,它只在启动项目中查找连接字符串。我刚刚删除了[ForeignKey]属性,它就工作了。但是我如何将foreignkey添加到该类中?您不需要为类添加key,否则foreignkey EF将自动计算出类的key,当看到ApplicationUser时,它将为我们这些被迫显式执行操作的人添加foreignkey:而不是删除foreignkey引用,确保它在您的上下文类中有相应的DbSet。这是正确的答案。带有userId属性的virtualapplicationuser属性允许框架按约定正确添加foreignkey。但是我如何将foreignkey添加到该类中?您不需要为类添加key,否则foreignkey EF将自动计算出类的key,当看到ApplicationUser时,它将为我们这些被迫显式执行操作的人添加foreignkey:而不是删除foreignkey引用,