MVC 6创建视图问题:创建DBContext以获取模型时出错

时间:2016-04-08 16:45:49

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

尝试使用NavBar模型和下面显示的NavBarEntity(在MVC6中)创建“创建”视图时会收到此消息...

enter image description here

运行所选代码生成器时出错:创建DBVContext实例以获取模型时出错...值不能为null ...参数名称:connectionString

我在View Wizard中选择了这个模式......

public class NavBarModel
{
    public string ID { get; set; }
    public List<LinkModel> Links { get; set; }
}

这个DBContext类在这里显示......

public class NavBarEntity : DbContext
    {
        public NavBarEntity()
        {
            ID = Guid.NewGuid().ToString();
        }
        [Key]
        public string ID { get; set; }
        public DbSet<List<LinkModel>> Links { get; set; }
    }

这里显示的是LinkModel ..

public class LinkModel
{
    public LinkModel()
    {
        ID = Guid.NewGuid().ToString();
    }
    [Key]
    private string ID { get; set; }
    public string HREF { get; set; }
    public string Text { get; set; }
}

配置服务看起来像这样......

        var cfg2 = Configuration["Data Source=MyPC\\SQLEXPRESS;Initial Catalog=Dashboard;Integrated Security=True;Pooling=False"];
        services.AddEntityFramework()
            .AddSqlServer()
            .AddDbContext<ApplicationDbContext>(options =>
                options.UseSqlServer(cfg))
            .AddDbContext<NavBarEntity>(options =>
            {
                options.UseSqlServer(cfg2);
            });

问题:我做错了什么?

2 个答案:

答案 0 :(得分:1)

您尝试将DbContext和实体结合起来的方式并不正确。 DbContext应该引用您拥有的任何实体作为DbSets - 实体不应该从它继承。

您的DbContext应该与此类似(EF6)

public class MyDbContext : DbContext
{
   public MyDbContext(string connectionString) 
      : base(connectionString)
   { }

   public DbSet<NavBarEntity> NavBars { get; set; }
   // Other entities
}

构造函数采用您要使用的web.config中定义的连接字符串条目的名称。还有其他方法可以做到这一点 - 请参阅here

然后将您的实体创建为一个简单的类(POCO):

public class NavBarEntity
{
   public NavBarEntity()
   {
      ID = Guid.NewGuid().ToString();
   }

   [Key]
   public string ID { get; set; }

   // Other properties/columns here
} 

修改

我原来的回答是基于EF6而不是EF7。以下是我如何在EF7中实现上下文的完整性:

public class MyDbContext : DbContext
{
   public MyDbContext(DbContextOptions<MyDbContext> options) 
      : base(options)
   { }

   public DbSet<NavBarEntity> NavBars { get; set; }
   // Other entities
}

答案 1 :(得分:1)

感谢上面列出的帮助..

对于MVC6和EF7的新手,名为ConfigureServices的方法必须包含指向appsetting.json的json指针。该方法可在Startup.cs文件中找到。

这是与上面显示的代码匹配的服务配置。括号中的字符串值指向json位置...

        var cfg2 = Configuration["Data:DashboardContext:ConnectionString"];
        services.AddEntityFramework()
            .AddSqlServer()
            .AddDbContext<DashboardContext>(options =>
            {
                options.UseSqlServer(cfg2);
            })

但是,你还必须像这样在appsettings.json中输入一个值:

  "Data": {
    "DefaultConnection": {
      "ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=aspnet5-TestWebApplication1-d91c23e4-3565-476d-a7c0-45665bc0c367;Trusted_Connection=True;MultipleActiveResultSets=true"
    },
    "DashboardContext": {
       "ConnectionString": "Data Source= MYPC\\SQLEXPRESS;Initial Catalog=Dashboard;Integrated Security=True;Pooling=False"
      }
  },

参数名称:connectionString 为null的根本原因是appsettings.json必须完全如上所示。 json解析例程必须能够找到字符串名称/值对...请注意,这些配置属于&#34;数据&#34;包含其他名称的名称。在这种情况下&#34; DefaultConnection&#34;默认情况下,我添加了&#34; DashboardContext&#34;部分。

同样在MVC 6中,您必须将connectionString类型更改为IServiceProvider而不是之前的字符串...

public class DashboardContext : DbContext
{
    public DashboardContext(IServiceProvider connectionString) : base (connectionString)
    {}
  public DbSet<NavBarEntity> NavBars { get; set; }
}

唉:视图没有问题......是的!

The Views