You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 10:44:57