尝试使用NavBar模型和下面显示的NavBarEntity(在MVC6中)创建“创建”视图时会收到此消息...
运行所选代码生成器时出错:创建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);
});
问题:我做错了什么?
答案 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; }
}
唉:视图没有问题......是的!