求助:MVC中Entity Framework数据库优先模式更新重复错误
解决EF数据库优先多模型上下文不识别/更新后失效问题(无需T4转换)
我完全懂你这种被重复问题折腾的痛苦——数据库优先分多个模型时,每次更新就搞乱上下文,手动改完下次又炸,确实耗时间。不用T4的话,咱们可以靠EF原生的配置和分部类来彻底解决这个问题,步骤很清晰:
1. 生成模型时固定上下文名称(从根源避免自动改名)
你之前踩的坑就是生成时默认用连接字符串名当上下文名,每次更新都会跟着变。其实在"从数据库生成模型"的向导里,有个很容易被忽略的设置:
- 走到选择完要包含的表和视图那一步后,继续下一步,会看到实体容器名称的输入框(不是模型名称),把这个改成你想要的固定名称,比如
WebMapDbContext,不要用默认的连接字符串相关名称。 - 同时保持你之前的设置:不保存连接字符串到配置文件,用已有的有效连接。
这样每次更新模型时,EF都会用你指定的这个固定名称生成上下文类,不会再乱改了。
2. 用分部类保存自定义构造函数(避免被覆盖)
自动生成的上下文类本身就是分部类,咱们可以利用这一点把自定义配置和自动生成的代码分开:
- 找个不会被EF覆盖的位置(比如项目根目录下的
Contexts文件夹),新建一个独立的.cs文件,比如WebMapDbContext.Custom.cs。 - 在这个文件里写和自动生成类同名的分部类,添加你的自定义构造函数:
每次更新模型时,EF只会覆盖自动生成的那个分部类文件,你自己写的这个文件完全不受影响,构造函数自然一直有效。namespace YourProjectNamespace.Models // 必须和自动生成的上下文类命名空间一致 { public partial class WebMapDbContext { // 用你已有的连接字符串名称初始化 public WebMapDbContext() : base("name=YourExistingConnectionStringName") { // 这里可以加你的自定义配置,比如禁用延迟加载、设置初始化策略等 } } }
3. 确保命名空间完全一致
这点很关键!你自己写的分部类的命名空间,必须和EF自动生成的上下文类的命名空间一模一样,否则两个分部类不会合并,你的自定义构造函数就不会生效。
4. 更新后的正确清理重建流程
每次更新模型后,别只跑自定义工具,按这个顺序来:
- 先执行
Build > Clean Solution,清空旧的编译文件 - 再执行
Build > Rebuild YourProjectName,确保新生成的代码被正确编译
这样就能彻底解决上下文不识别的问题,而且下次更新模型也不会复发,完全不用碰T4模板。
内容的提问来源于stack exchange,提问作者Andy Brown
相关产品推荐
相关产品推荐

