EF Core中如何指定隶属于非默认架构的多对多关系连接表
解决EF Core多对多连接表指定非默认架构的问题
我之前也踩过这个坑——直接在连接表名称里拼接架构名(比如Test.PostTag)根本不会被EF Core正确解析,它会把整个字符串当作表名来处理,自然找不到Test架构下的表。正确的做法是通过ToTable方法显式指定连接表的架构和表名。
正确的配置代码
你只需要在UsingEntity的第三个配置委托里,添加ToTable方法来指定架构和表名即可:
modelBuilder.Entity<Post>() .HasMany(p => p.Tags) .WithMany(p => p.Posts) .UsingEntity<Dictionary<string, object>>( "PostTag", j => j .HasOne<Tag>() .WithMany() .HasForeignKey("TagId") .HasConstraintName("FK_PostTag_Tags_TagId") .OnDelete(DeleteBehavior.Cascade), j => j .HasOne<Post>() .WithMany() .HasForeignKey("PostId") .HasConstraintName("FK_PostTag_Posts_PostId") .OnDelete(DeleteBehavior.ClientCascade), // 显式指定连接表的架构和表名 joinEntity => joinEntity.ToTable("PostTag", "Test") );
为什么之前的方法无效?
EF Core的UsingEntity第一个参数只是用来指定连接表的基础名称,它不会自动解析其中的架构部分。当你传入Test.PostTag时,EF Core会把这个字符串完整当作表名去查询,所以会抛出Invalid object name 'PostTag'.(其实它找的是Test.PostTag这个表名,而不是Test架构下的PostTag)。
通过第三个配置委托里的ToTable方法,我们明确告诉EF Core:这个连接表的名称是PostTag,隶属于Test架构,这样生成的SQL就会正确引用[Test].[PostTag],解决找不到对象的问题。
内容的提问来源于stack exchange,提问作者Daniel Jonsson
相关产品推荐
相关产品推荐

