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

.NET 6迁移SQL Server报错:无法创建DatacussContext实例

EF Core创建SQL Server迁移时提示无法创建DatacussContext实例

Unable to create an object of type 'DatacussContext'. For the different patterns supported at design time, see https://go.microsoft.com/fwlink/?linkid=851728

以下是相关代码:

Program.cs代码

using datacuss.Data;
using Microsoft.EntityFrameworkCore;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

builder.Services.AddDbContext<DatacussContext>(options =>
{
    options.UseSqlServer(builder.Configuration.GetConnectionString("Datacuss"));
});

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

DatacussContext类代码

using datacuss.Data.Configurations;
using datacuss.Models;
using Microsoft.EntityFrameworkCore;

namespace datacuss.Data
{
    public class DatacussContext : DbContext
    {
        public DatacussContext(DbContextOptions<DatacussContext> options) : base(options) 
        { 
        }

        public DbSet<UserGroup> UserGroups { get; set; }

        protected override void OnModelCreating (ModelBuilder builder)
        {
            builder
                .ApplyConfiguration(new UserGroupConfiguration());
        }
    }
}

UserGroupConfiguration类代码

using datacuss.Models;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;

namespace datacuss.Data.Configurations
{
    public class UserGroupConfiguration : IEntityTypeConfiguration<UserGroup>
    {
        public void Configure(EntityTypeBuilder<UserGroup> builder)
        {
            builder.Property(x => x.State).HasMaxLength(2);
            builder.Property(x => x.Id).UseIdentityColumn(100010, 10);
            builder.Property(x => x.StreetAddress).HasColumnName("Street Address");
            builder.Property(x => x.PostalCode).HasColumnName("Zip / Postal Code");
            builder.Property(x => x.ContactName).HasColumnName("Contact Name");
            builder.Property(x => x.ContactPhone).HasColumnName("Contact Phone");
            builder.Property(x => x.InvoiceEmail).HasColumnName("Invoice E-mail");
            builder.Property(x => x.ApplicationID).HasColumnName("Application ID");
            builder.Property(x => x.InvFundAR).HasColumnName("Invoice Fund AR");
            builder.Property(x => x.InvInclExcelFile).HasColumnName("Invoice Include Excel File");

            builder.HasData(new List<UserGroup>
            {
                new UserGroup {
                    Id=100010,
                    Name="Evance Business Services",
                    Status=1,
                    Created=DateTime.Now,
                    StreetAddress="507 Weston Ridge Drive",
                    City="Naperville",
                    State="IL",
                    PostalCode="60563",
                    ContactName="Bill Paulding",
                    ContactPhone="3313333333",
                    InvoiceEmail="bpaulding@evance.com",
                    ApplicationID=1,
                    InvFundAR=0,
                    InvInclExcelFile=0,
                    InvTypeID=1
                },
                new UserGroup {
                    Id=100020,
                    Name="Sample Staffing Company",
                    Status=1,
                    Created=DateTime.Now,
                    StreetAddress="507 Weston Ridge Drive",
                    City="Naperville",
                    State="IL",
                    PostalCode="60563",
                    ContactName="Bill Paulding",
                    ContactPhone="3313333333",
                    InvoiceEmail="bpaulding@evance.com",
                    ApplicationID=1,
                    InvFundAR=0,
                    InvInclExcelFile=0,
                    InvTypeID=1
                }
            });
        }
    }
}

UserGroup实体类代码

namespace datacuss.Models
{
    public class UserGroup
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public int Status { get; set; }
        public DateTime Created { get; set; }
        public string StreetAddress { get; set; }
        public string City { get; set; }
        public string State { get; set; }
        public string PostalCode { get; set; }
        public string ContactName { get; set; }
        public string? ContactPhone { get; set; }
        public string? ContactFax { get; set; }
        public string? InvoiceEmail { get; set; }
        public int? ApplicationID { get; set; }
        public int InvFundAR { get; set; }
        public int InvInclExcelFile { get; set; }
        public int InvTypeID { get; set; }
    }
}

AppSettings.json配置

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "Datacuss": "Data Source=DESKTOP-M4T8DMP\MSSQLSERVER01;Initial Catalog=datacuss;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False"
  }
}

已根据官方指引调整过代码,但问题仍未解决。


问题排查与修复方案

1. 修正Program.cs中服务注册顺序

你在var app = builder.Build()之后才注册DbContext,这会导致EF Core迁移工具无法在设计时找到DatacussContext的服务注册——builder.Build()会固化服务容器,后续添加的服务不会被包含进去。

修改后的Program.cs:

using datacuss.Data;
using Microsoft.EntityFrameworkCore;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();

// 先注册DbContext,再构建app
builder.Services.AddDbContext<DatacussContext>(options =>
{
    options.UseSqlServer(builder.Configuration.GetConnectionString("Datacuss"));
});

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

2. 修正连接字符串的转义问题

JSON中反斜杠\需要转义为\\,否则配置文件无法正确解析数据源地址。修改AppSettings.json中的连接字符串:

"ConnectionStrings": {
  "Datacuss": "Data Source=DESKTOP-M4T8DMP\\MSSQLSERVER01;Initial Catalog=datacuss;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False"
}

3. 可选:添加设计时工厂(如果上述修复仍无效)

如果迁移工具还是无法找到上下文,可以添加一个设计时工厂类,让EF Core明确知道如何创建DatacussContext实例。在datacuss.Data命名空间下创建以下类:

using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Design;
using Microsoft.Extensions.Configuration;
using System.IO;

namespace datacuss.Data
{
    public class DatacussContextFactory : IDesignTimeDbContextFactory<DatacussContext>
    {
        public DatacussContext CreateDbContext(string[] args)
        {
            var configuration = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json")
                .Build();

            var optionsBuilder = new DbContextOptionsBuilder<DatacussContext>();
            optionsBuilder.UseSqlServer(configuration.GetConnectionString("Datacuss"));

            return new DatacussContext(optionsBuilder.Options);
        }
    }
}

完成以上修改后,重新运行迁移命令(如Add-Migration InitialCreate或dotnet ef migrations add InitialCreate)即可。


内容的提问来源于stack exchange,提问作者Rusty0918-B

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 06:45:55