EF6数据库优先模式下Expense实体不在当前上下文模型的问题
解决EF6数据库优先模式下Expense实体不在上下文模型中的问题
你遇到的这个问题在EF数据库优先模式里确实挺常见,我来给你补充几个关键的排查和解决方向:
1. 重新确认EDMX模型的映射完整性
- 打开EDMX设计器,先确认Expense实体是否存在,右键该实体选择「Mapping Details」,检查它是否正确关联到数据库的
Expense表,所有字段(尤其是主键ExpenseId)的映射是否匹配。 - 右键EDMX空白区域,选择「Update Model from Database」,重新勾选
Expense表,更新时留意输出窗口有没有报错(比如字段类型不兼容、表权限问题等),自动更新偶尔会因为小问题跳过实体生成。
2. 重置EDMX自动生成的代码
如果手动修改过Monies.Context.cs或Expense.cs,很容易和自动生成的代码冲突:
- 先删除EDMX生成的
Monies.Context.cs、Expense.cs等自动生成的实体文件(注意保留你自己写的ExpenseRepository.cs)。 - 重新执行「Update Model from Database」,让EF重新生成所有实体和上下文代码,确保代码完全匹配EDMX模型。
3. 修复连接字符串(核心!)
数据库优先模式必须使用EntityClient类型的连接字符串,而非普通ADO.NET连接字符串。你之前改成ADO.NET是错误的,正确格式需要包含元数据部分,示例如下:
<connectionStrings> <add name="MoniesEntities" connectionString="metadata=res://*/Monies.csdl|res://*/Monies.ssdl|res://*/Monies.msl;provider=System.Data.SqlClient;provider connection string="data source=你的服务器;initial catalog=你的数据库;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.EntityClient" /> </connectionStrings>
确认App.config和Web.config里的连接字符串都是这种格式,且名称MoniesEntities和上下文构造函数里的name=MoniesEntities完全一致。
4. 排查程序集版本冲突
- 清理整个解决方案的
bin和obj文件夹,重新编译所有项目,避免Web项目引用了旧版本的MoneyManager.DB程序集。 - 在
SaveExpense方法里加两行调试代码,确认上下文和实体来自同一个程序集:Console.WriteLine(db.GetType().AssemblyQualifiedName); Console.WriteLine(typeof(Expense).AssemblyQualifiedName);
如果输出的程序集版本或路径不一致,说明引用存在问题。
5. 排除命名空间冲突
检查解决方案里有没有其他地方定义了Expense类(比如DTO层的MoneyManager.DTO.Expense),确保ExpenseRepository里实例化的是MoneyManager.DB.Expense,避免using语句导致的类型歧义。
另外,你上下文里的OnModelCreating方法抛出UnintentionalCodeFirstException是正常的,数据库优先模式不需要修改这个方法,不用手动在里面关联实体和表。
内容的提问来源于stack exchange,提问作者Deep
相关产品推荐
相关产品推荐

