使用Entity Framework生成脚手架控制器时抛出调用目标异常求助
Entity Framework Scaffolding Error: "Exception has been thrown by the target of an invocation"
我之前也踩过这个脚手架的坑,这个异常其实是个“包装器”,真正的问题藏在内部细节里。咱们一步步来排查解决:
1. 先揪出真正的内部异常
这个外层的“目标调用异常”没什么实际参考价值,得拿到具体的错误信息。你可以打开Package Manager Console,手动执行脚手架命令,这样能看到完整的错误堆栈:
如果是生成控制器和视图,用这条命令(匹配你的模型和上下文名称):
Scaffold-Controller -Model Categories -Context AppContext -ControllerName CategoriesController -Views -Force
执行后控制台会输出详细的内部错误,比如连接问题、模型映射错误或者权限问题,这才是解决问题的关键。
2. 修正连接字符串的小问题
你的Web.config里连接字符串开头多了个@符号——这是C#里的逐字字符串标记,XML配置里根本不需要它,赶紧删掉:
<add name="defaultConnection" connectionString="Data Source=DESKTOP-TJMV4UV\SQLEXPRESS;Initial Catalog=TesteMVC;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False" providerName="System.Data.SqlClient" />
另外,如果你的AppContext在类库项目里,记得把这条连接字符串复制到启动项目的Web.config里,不然上下文找不到连接配置。
3. 检查模型的关系配置
你的Categories模型里关联了Posts集合,要确保Posts模型的配置没问题:
- 必须有指向
CategoryID的外键属性,比如:public class Posts { [Key] public int PostID { get; set; } // 显式添加外键 public int CategoryID { get; set; } public string Content { get; set; } // 反向导航属性 public virtual Categories Category { get; set; } } - 如果
Posts模型里没有显式外键,EF会自动生成影子属性,但脚手架对这种隐式配置兼容性不好,最好显式写出来。 - 另外,
Categories里的Name字段如果在数据库是必填的,建议加上[Required]注解,避免脚手架处理空值时出错。
4. 确认数据库的连接权限
先验证一下当前用户能不能正常访问数据库:
- 打开SQL Server Management Studio,用Windows身份验证连接
DESKTOP-TJMV4UV\SQLEXPRESS,看看能不能打开TesteMVC数据库,读写数据。 - 如果连不上,要么是SQL Server服务没启动,要么是当前用户没有权限,先把这个基础问题解决。
5. 清理项目缓存再尝试
有时候项目里的编译缓存会搞事情:
- 右键你的项目 → 清理
- 然后右键 → 重建
- 重启Visual Studio,再尝试生成脚手架。
6. 更新EF相关包
旧版本的EF可能存在脚手架的bug,打开NuGet包管理器,把Entity Framework(或EntityFrameworkCore,如果是Core项目)更新到最新的稳定版,再试一次。
先从第一步查看内部异常开始,找到具体错误后针对性解决,大部分情况下都是连接字符串、模型配置或者权限的小问题。
内容的提问来源于stack exchange,提问作者JNeves
相关产品推荐
相关产品推荐

