EF注册用户时报错实体类型<User>不属于当前上下文模型的问题求解
错误原因
- User实体重名引用错误:项目中可能存在多个命名空间下的
User类(比如微软Identity自带的User类、系统安全命名空间下的User类),DeskDatabaseUsers上下文配置时引用的User和控制器提交时接收的User不是同一个类 - 上下文配置冲突:
DeskDatabaseUsers是partial类,若存在其他分部定义的OnModelCreating方法没有调用基类方法,会覆盖掉User实体的映射配置 - 连接字符串配置错误:
web.config中name=DeskDatabaseUsers的连接字符串指向的数据库错误,或对应数据库中没有生成User表 - User实体配置错误:自定义的
User类被添加了[NotMapped]特性,或访问修饰符非public,导致EF无法识别该实体 - 多上下文迁移错误:项目存在两个DbContext,执行迁移时没有指定对应上下文,导致
DeskDatabaseUsers对应的数据库没有生成User表结构
解决思路
- 优先检查实体引用:将控制器Registration方法的参数显式指定全命名空间,避免重名引用错误:
public ActionResult Registration([Bind(Exclude = "IsEmailVerified,ActivationCode")] CRUDProject.Models.User user)
同时检查User实体类的定义,确认没有添加[NotMapped]特性,且访问修饰符为public
2. 检查partial类配置:确认DeskDatabaseUsers所有分部定义的OnModelCreating方法,第一行都调用了base.OnModelCreating(modelBuilder),避免配置被覆盖
3. 核对连接字符串:检查web.config中DeskDatabaseUsers对应的连接字符串,确认指向的数据库正确
4. 执行指定上下文的迁移:针对多上下文场景,执行迁移时需要显式指定上下文,在包管理器控制台执行以下命令:
Add-Migration InitUserTable -Context DeskDatabaseUsers Update-Database -Context DeskDatabaseUsers
- 调试验证实体是否被加载:在Registration方法的
DeskDatabaseUsers初始化块中添加以下调试代码,运行时查看返回结果中是否包含你定义的User实体:
var allEntities = ((IObjectContextAdapter)dc).ObjectContext.MetadataWorkspace .GetItems<System.Data.Entity.Core.Metadata.Edm.EntityType>(System.Data.Entity.Core.Metadata.Edm.DataSpace.CSpace) .Select(e => e.FullName); // 调试查看allEntities中是否存在CRUDProject.Models.User
内容的提问来源于stack exchange,提问作者Ács Dániel
相关产品推荐
相关产品推荐

