如何在EF中排除自动生成的多对多关联表迁移?
解决方案
方法一:在关联表配置块内直接设置
在UsingEntity的配置委托中,通过j.Metadata调用SetIsTableExcludedFromMigrations(true),修改后的完整配置代码如下:
modelBuilder.Entity<Client>(entity => { entity.Property(e => e.State) .HasConversion<string>(); entity.HasMany(d => d.Users) .WithMany(p => p.Clients) .UsingEntity<Dictionary<string, object>>( "ClientUser", l => l.HasOne<AspNetUser>().WithMany().HasForeignKey("UserId"), r => r.HasOne<Client>().WithMany().HasForeignKey("ClientId"), j => { j.HasKey("ClientId", "UserId"); j.ToTable("client_users"); j.IndexerProperty<string>("ClientId"); j.IndexerProperty<string>("UserId"); // 添加此行标记表排除迁移 j.Metadata.SetIsTableExcludedFromMigrations(true); }); });
方法二:在模型构建完成后定位并排除
如果方法一未生效,可在OnModelCreating方法末尾,通过模型元数据定位关联表对应的动态实体类型,再设置排除:
protected override void OnModelCreating(ModelBuilder modelBuilder) { // 原有配置代码... // 查找client_users表对应的实体类型并排除迁移 var clientUserEntity = modelBuilder.Model.GetEntityTypes() .FirstOrDefault(t => t.GetTableName() == "client_users"); if (clientUserEntity != null) { clientUserEntity.SetIsTableExcludedFromMigrations(true); } }
说明
EF Core自动生成的无实体关联表本质是基于Dictionary<string, object>的动态实体类型,上述两种方式均可精准获取其元数据并标记排除迁移。若之前调用SetIsTableExcludedFromMigrations无效,通常是元数据对象的获取位置不正确,调整后即可生效。
内容的提问来源于stack exchange,提问作者Dmitry Sazonov
相关产品推荐
相关产品推荐

