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 依次持有对 CustomerProfile
和 ProviderProfile
的引用其中也有所有这些 table(他们应该住的地方)。
提供更多详细信息:CustomerProfile 和 ProviderProfile 都有自己的 DbContext,并且在其中引用了其他几个 table(这些相关的 table 属于每个配置文件的架构) .每个配置文件中的 tables 与配置文件 classes 属于同一架构。那些 Entites/Tables 是在他们不属于的身份模式(用户)中生成的罪魁祸首。
有 3 个架构:
- 用户(IdentityContext - 用户架构)
- 客户(CustomersContext - 客户模式)
- 提供商(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);
// ...
}
我正在尝试在两个 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 依次持有对 CustomerProfile
和 ProviderProfile
的引用其中也有所有这些 table(他们应该住的地方)。
提供更多详细信息:CustomerProfile 和 ProviderProfile 都有自己的 DbContext,并且在其中引用了其他几个 table(这些相关的 table 属于每个配置文件的架构) .每个配置文件中的 tables 与配置文件 classes 属于同一架构。那些 Entites/Tables 是在他们不属于的身份模式(用户)中生成的罪魁祸首。
有 3 个架构:
- 用户(IdentityContext - 用户架构)
- 客户(CustomersContext - 客户模式)
- 提供商(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);
// ...
}