使用EF Core 6脚手架创建控制器失败问题求助
使用EF Core 6与.NET 6,已将模型、DbContext和控制器拆分到同一解决方案的不同项目中,所有项目均安装了相同版本的必要NuGet包。尝试通过「添加MVC控制器(带视图,使用Entity Framework)」脚手架创建控制器时出现错误。即使移除OnModelCreating方法的重写、多次清理NuGet缓存,问题仍未解决。
相关代码如下:
DbContext类
using Microsoft.EntityFrameworkCore; using WMS.Models; namespace WMS.DataAccess { public class ApplicationDBContext :DbContext { protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<OrderHeader>() .HasKey(a => new { a.Order, a.ReleaseNumber }); modelBuilder.Entity<OrderDetail>() .HasKey(b => new { b.Order, b.ReleaseNumber }); modelBuilder.Entity<OrderDetail>() .HasOne(b => b.OrderHeader) .WithMany(a => a.OrderDetails) .HasForeignKey(b => new { b.Order, b.ReleaseNumber }); } public ApplicationDBContext(DbContextOptions<ApplicationDBContext> options) : base(options) { } public DbSet<OrderHeader> OrderHeaders { get; set; } public DbSet<OrderDetail> OrderDetails { get; set; } public DbSet<Item> Items { get; set; } } }
Item模型类
using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Text; using System.Threading.Tasks; namespace WMS.Models { public class Item { [Key] public string ItemId { get; set; } public int Weight { get; set; } public string ItemDescription { get; set; } } }
附错误截图、脚手架设置截图、解决方案资源管理器截图及各项目NuGet包截图。
校验脚手架工具版本匹配性
打开包管理器控制台,执行dotnet tool list查看已安装的dotnet-aspnet-codegenerator版本,确保其与.NET 6、EF Core 6版本完全一致。若版本不匹配,执行dotnet tool update -g dotnet-aspnet-codegenerator更新到对应版本。检查项目引用与NuGet依赖
- 确认控制器项目已正确添加模型项目、DbContext项目的引用。
- 逐一核对所有项目的NuGet包:
Microsoft.EntityFrameworkCore、Microsoft.EntityFrameworkCore.Design、数据库提供商包(如Microsoft.EntityFrameworkCore.SqlServer)、Microsoft.AspNetCore.Mvc相关包必须版本完全统一,无版本冲突。
验证DbContext的注册与配置
- 检查启动项目的
Program.cs,确认DbContext已正确注册:builder.Services.AddDbContext<ApplicationDBContext>(options => options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection"))); - 确认
appsettings.json中的连接字符串格式正确、指向目标数据库。
- 检查启动项目的
手动执行脚手架命令
若VS界面操作失败,尝试用包管理器控制台或dotnet命令手动生成:- 包管理器控制台命令示例:
Scaffold-DbContext "Server=.;Database=你的数据库名;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models -Context ApplicationDBContext -Force - dotnet命令示例:
dotnet aspnet-codegenerator controller -name ItemController -m Item -dc ApplicationDBContext --relativeFolderPath Controllers --useDefaultLayout --referenceScriptLibraries -p 你的DbContext项目路径 -c 你的控制器项目路径
- 包管理器控制台命令示例:
检查复合键模型定义
确认OrderHeader和OrderDetail模型中的复合键属性(Order、ReleaseNumber)类型一致,且无空值约束冲突。清理重建解决方案
执行Clean Solution,删除所有项目下的bin、obj文件夹,再执行Rebuild Solution,确保无编译错误。检查VS环境完整性
确保使用的Visual Studio 2022已安装最新更新,且ASP.NET和Web开发组件完整。
内容的提问来源于stack exchange,提问作者Ipwn touch

