EF Core 迁移从其他上下文添加表

EF Core Migration Adding Tables from Other Contexts

我正在尝试在两个 table(CustomerProfile 和 ProviderProfile)和主要 ASP.NET Core IdentityUser table(AppUser ).当我 运行 迁移时,所有 table 都是从 AppUser 模式(用户)内部的每个模式(3 个 table 中的每一个都有自己的模式设置)生成的。以下是 IdentityContext 的配置方式:

public class IdentityContext : IdentityDbContext<AppUser, AppRole, string>
{
    private const string schema = "Users";

    
    public DbSet<CustomerProfile> CustomerProfile { get; set; }
    public DbSet<ProviderProfile> ProviderProfile { get; set; }

   public override void OnModelCreating(ModelBuilder builder)
   {
        base.OnModelCreating(builder);
        builder.HasDefaultSchema(schema);

        builder.Entity<AppUser>()
            .HasOne(x => x.ProviderProfile)
            .WithOne(x => x.User)
            .HasForeignKey<ProviderProfile>(x => x.UserId);
        
        builder.Entity<AppUser>()
            .HasOne(x => x.CustomerProfile)
            .WithOne(x => x.User)
            .HasForeignKey<ProviderProfile>(x => x.UserId);
    }
}

这是 AppUser (IdentityUser) class 定义:

public class AppUser : IdentityUser
{
    public bool IsServiceProvider { get; set; }
    public virtual CustomerProfile CustomerProfile { get; set; }
    public virtual ProviderProfile ProviderProfile { get; set; }
}

当我 运行 迁移数据库用户模式时,table 形成了其他 DbContext,这些 DbContext 依次持有对 CustomerProfileProviderProfile 的引用其中也有所有这些 table(他们应该住的地方)。

提供更多详细信息:CustomerProfile 和 ProviderProfile 都有自己的 DbContext,并且在其中引用了其他几个 table(这些相关的 table 属于每个配置文件的架构) .每个配置文件中的 tables 与配置文件 classes 属于同一架构。那些 Entites/Tables 是在他们不属于的身份模式(用户)中生成的罪魁祸首。

有 3 个架构:

  1. 用户(IdentityContext - 用户架构)
  2. 客户(CustomersContext - 客户模式)
  3. 提供商(ProvidersContext - 提供商模式)

因此,用户上下文与客户和提供商具有 1..1 关系 tables。

CustomersContext 有几个与客户相关的 table ProvidersContext 有几个 table 与提供者

相关

客户 + 提供商上下文中的 table 被转储到用户 (IdentityContext) 架构中

每当 EF 在引用 B class 的实体 class A 中遇到 属性 时,它会添加一个连接两者的新关系。

class Student {
    public School School { get; set; } // <-- many-to-one relation
    public List<Course> Courses { get; set; } // <-- many-to-many relation
    // ...
}

这会发生 by convention 并且不需要开发人员的参与。

By default, a relationship will be created when there is a navigation property discovered on a type. A property is considered a navigation property if the type it points to can not be mapped as a scalar type by the current database provider.

如果你想阻止 EF Core 将这些属性解释为关系,你需要明确地告诉它 ignore those properties 并且 EF 不会尝试将它们映射到数据库。

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<AppUser>()
        .Ignore(e => e.CustomerProfile);
    // ...
}