EF 6.4.4中使用Fluent API配置多对多关联时模型验证报错求助
结合你的场景(手动LINQ连接正常,说明数据库结构本身无问题,问题出在EF模型配置逻辑上),以下是导致报错的常见原因:
连接表配置逻辑不符合EF规则
EF6对多对多关系的自动映射有严格要求:如果你的连接表没有额外业务字段,不能把它定义成实体类,直接在两个主实体的Fluent API配置里用HasMany+WithMany+Map指定连接表即可。要是你既定义了JoinTable实体,又试图用多对多的配置方式,EF会因为无法识别连接表的角色而抛出验证错误。
若连接表有额外字段,必须把它当成实体,然后分别配置TableA与JoinTable、TableB与JoinTable的一对多关系,不能再用WithMany的多对多配置。主键/外键配置不匹配
- 连接表的外键字段名和你在Fluent API的
MapLeftKey/MapRightKey里填写的内容不一致,比如数据库里连接表的外键是TableA_Id,但你配置成了TableAId,EF找不到对应关联关系就会报错。 - 主实体(TableA/TableB)未正确配置主键:不管是用
[Key]特性还是Fluent API的HasKey,必须明确标记主键,否则EF无法识别实体的唯一标识,触发模型验证错误。
- 连接表的外键字段名和你在Fluent API的
导航属性定义不一致
比如你在TableA里定义了ICollection<TableB>的导航属性,但TableB里没有对应的ICollection<TableA>,却在Fluent API里写了WithMany(b => b.TableAs),EF找不到对应的导航属性就会报错。另外,导航属性要声明成virtual,EF6依赖它实现延迟加载和代理生成,没加的话也可能导致模型验证失败。数据库表结构与模型配置不兼容
要是连接表没设置复合主键(EF要求无额外字段的多对多连接表必须以两个外键作为复合主键),或者实体的字段类型和数据库里的对应字段类型不匹配(比如模型里是int,数据库里是bigint),EF在模型验证阶段会检测到这些问题并抛出错误。而手动写LINQ连接时,你直接对接数据库,不会触发EF的模型校验,所以能正常运行。
内容的提问来源于stack exchange,提问作者AndyW

