Entity Framework Core执行add-migration时StoreContext创建失败问题
执行Code-First的add-migration命令时,出现错误:无法创建StoreContext类型的对象。添加-verbose参数后,错误详情如下:
System.InvalidOperationException: 尝试激活'КПО_лаб_2._3.StoreContext'时,无法解析类型为'Microsoft.EntityFrameworkCore.DbContextOptions`1[КПО_лаб_2._3.StoreContext]'的服务。
at Microsoft.Extensions.DependencyInjection.ActivatorUtilities.ConstructorMatcher.CreateInstance(IServiceProvider provider)
at Microsoft.Extensions.DependencyInjection.ActivatorUtilities.CreateInstance(IServiceProvider provider, Type instanceType, Object[] parameters)
at Microsoft.Extensions.DependencyInjection.ActivatorUtilities.GetServiceOrCreateInstance(IServiceProvider provider, Type type)
at Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations.<>c__DisplayClass21_4.b__13()
End of inner exception stack trace ---
对应的StoreContext代码:
using Microsoft.EntityFrameworkCore; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace КПО_лаб_2._3 { public class StoreContext : DbContext { public DbSet<Client> Clients { get; set; } public DbSet<Order> Orders { get; set; } public DbSet<Product> Products { get; set; } public DbSet<OrderDetail> OrderDetails { get; set; } public StoreContext(DbContextOptions<StoreContext> options) : base(options) { } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseSqlServer("Server=localhost;Database=Store;Integrated Security=True;TrustServerCertificate=Yes;Trusted_Connection=True"); } protected override void OnModelCreating(ModelBuilder modelBuilder) { // Настройка связей между сущностями // Связь "Клиент" (Client) - "Заказ" (Order) (1-*) modelBuilder.Entity<Order>() .HasOne(o => o.Client) .WithMany(c => c.Orders) .HasForeignKey(o => o.ClientId); // Связь "Заказ" (Order) - "Детали заказа" (OrderDetail) (1-*) modelBuilder.Entity<OrderDetail>() .HasOne(od => od.Order) .WithMany(o => o.OrderDetails) .HasForeignKey(od => od.OrderId); // Связь "Товар" (Product) - "Детали заказа" (OrderDetail) (1-*) modelBuilder.Entity<OrderDetail>() .HasOne(od => od.Product) .WithMany(p => p.OrderDetails) .HasForeignKey(od => od.ProductId); } } }
方案1:添加无参数构造函数
在StoreContext中添加无参数构造函数,让EF Core设计时工具可以直接实例化上下文,同时保留OnConfiguring中的连接字符串配置:
public class StoreContext : DbContext { // 已有的DbSet定义... // 添加无参数构造函数 public StoreContext() { } public StoreContext(DbContextOptions<StoreContext> options) : base(options) { } // 已有的OnConfiguring和OnModelCreating方法... }
方案2:实现IDesignTimeDbContextFactory接口(推荐)
创建一个实现IDesignTimeDbContextFactory<StoreContext>的工厂类,EF Core设计时工具会自动识别这个类并使用它创建上下文实例,无需依赖项目的DI配置:
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Design; namespace КПО_лаб_2._3 { public class StoreContextFactory : IDesignTimeDbContextFactory<StoreContext> { public StoreContext CreateDbContext(string[] args) { var optionsBuilder = new DbContextOptionsBuilder<StoreContext>(); optionsBuilder.UseSqlServer("Server=localhost;Database=Store;Integrated Security=True;TrustServerCertificate=Yes;Trusted_Connection=True"); return new StoreContext(optionsBuilder.Options); } } }
方案3:配置DI并指定启动项目(ASP.NET Core项目)
如果是ASP.NET Core项目,确保在启动项目的Program.cs中注册StoreContext:
var builder = WebApplication.CreateBuilder(args); // 注册DbContext,可从配置文件读取连接字符串 builder.Services.AddDbContext<StoreContext>(options => options.UseSqlServer(builder.Configuration.GetConnectionString("StoreConnection"))); // 其他配置...
若上下文类位于类库项目,执行add-migration时需指定启动项目:
add-migration InitialCreate --startup-project ../你的Web项目路径
内容的提问来源于stack exchange,提问作者6a9heast

