使用Entity Framework迁移过程中遇到过一个问题,在这里拿出来晒晒。c#
Unable to create an object of type 'xxxContext'. For the different patterns supported at design time, see https://go.microsoft.com/fwlink/?linkid=851728ide
要解决这个问题,就是我下面要阐述的内容了。函数
咱们先来看看DbContext的两个构造函数:工具
protected DbContext(); public DbContext([NotNullAttribute] DbContextOptions options);
还有DbContext的两个重写方法:测试
protected internal virtual void OnConfiguring(DbContextOptionsBuilder optionsBuilder); protected internal virtual void OnModelCreating(ModelBuilder modelBuilder);
根据错误提示,在微软的官方文档中,咱们知道了配置DbContext有两种方式:ui
使用无参构造函数,必须重写OnConfiguring()
函数.net
public class BloggingContext : DbContext { public DbSet<Blog> Blogs { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) => optionsBuilder.UseSqlite("Data Source=blog.db"); }
这样使用的话,应用程序能够简单地实例化此类上下文,而无需将任何内容传递给构造函数:设计
using (var context = new BloggingContext()) { // do stuff }
使用有参构造函数,无需重写OnConfiguring()
函数code
public class BloggingContext : DbContext { public BloggingContext(DbContextOptions<BloggingContext> options) : base(options) { } public DbSet<Blog> Blogs { get; set; } }
这样使用的话,应用程序如今能够在实例化上下文时传递 DbContextOptions
,以下所示:blog
var optionsBuilder = new DbContextOptionsBuilder<BloggingContext>(); optionsBuilder.UseSqlite("Data Source=blog.db"); using (var context = new BloggingContext(optionsBuilder.Options)) { // do stuff }
那么按照官网的作法去写的话,为何还会出现文章最开头的那个错误呢?这里我使用控制台和Asp.net core程序各建立了一次程序后,发现上述问题是我在使用控制台程序测试代码时出现的,而Asp.net core程序却没有出现(具体的原理我还不清楚,但愿各路大侠看到能帮助解答一下)。
这里说一下控制台程序出现此问题的解决办法(微软官方文档):
public class BloggingContextFactory : IDesignTimeDbContextFactory<BloggingContext> { public BloggingContext CreateDbContext(string[] args) { var optionsBuilder = new DbContextOptionsBuilder<BloggingContext>(); optionsBuilder.UseSqlite("Data Source=blog.db"); return new BloggingContext(optionsBuilder.Options); } }
“能够经过实现接口来告诉工具如何建立 DbContext,经过建立类实现接口IDesignTimeDbContextFactory<TContext>
,若是实现此接口的类在与派生的项目相同的项目中或应用程序的启动项目中找到,则这些工具将绕过建立 DbContext 的其余方法,并改用设计时工厂。”
问题即可迎刃而解。
以上解决方法仅针对控制台程序使用或测试Entity Framework时出现的问题,由于Asp.net程序按照官网给定的两种方式去实现的话,不会出现这个问题。