.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
相关产品推荐
相关产品推荐

