独立项目中启用Migrations报错:Object Not set to an instance of object
我之前也碰到过完全一样的坑!这种在类库+控制台项目组合里搞EF Migrations的问题,十有八九是配置或者项目上下文的参数没搞对,给你几个我亲测有效的排查和解决方向:
1. 确认DbContext构造函数的连接字符串配置
很多时候这个Object Not set to an instance of object错误,根源是EF找不到正确的连接字符串。你要确保你的RestaurauntRepository(也就是你的DbContext类)的构造函数明确指定了连接字符串的名称:
public class RestaurauntRepository : DbContext { // 这里的"RestaurauntDb"要和配置文件里的连接字符串名称一致 public RestaurauntRepository() : base("name=RestaurauntDb") { } // 你的DbSet定义 public DbSet<Review> Reviews { get; set; } // ...其他实体 }
同时,控制台项目的app.config里必须有对应的连接字符串节点(EF Migrations会读取启动项目的配置,类库的app.config没用):
<connectionStrings> <add name="RestaurauntDb" connectionString="Data Source=YOUR_SERVER;Initial Catalog=RestaurauntDB;Integrated Security=True" providerName="System.Data.SqlClient" /> </connectionStrings>
2. 修正Migrations命令的参数
你用的命令参数有个小问题:-ContextProjectName应该填类库项目的名称,而不是完整的DbContext类名。如果你的类库项目叫RestaurauntData,正确的命令应该是:
enable-migrations -ContextTypeName RestaurauntData.RestaurauntRepository -ContextProjectName RestaurauntData -StartUpProjectName RestaurauntReviews
另外,一定要在Package Manager Console的默认项目下拉框里选中你的类库项目RestaurauntData,这个细节很容易被忽略!
3. 确保控制台项目有完整的EF配置
检查控制台项目的app.config里有没有EF的配置节点,没有的话加上:
<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>
4. 清理缓存并重新生成解决方案
有时候编译缓存会导致EF找不到上下文类,先右键解决方案选择清理,然后再重新生成所有项目,之后再尝试运行Migrations命令。
5. 验证DbContext能被正常初始化
在控制台项目的入口代码里加一段初始化DbContext的测试代码,确保EF能正常加载你的上下文:
static void Main(string[] args) { // 测试DbContext是否能正常实例化 using (var db = new RestaurauntData.RestaurauntRepository()) { // 输出数据库名称,验证连接是否有效 Console.WriteLine(db.Database.Connection.Database); } }
如果这段代码能正常运行,说明DbContext的配置是对的,再去跑Migrations命令就没问题了。
内容的提问来源于stack exchange,提问作者Curious-programmer

