Изменение схемы на IdentityServer при настройке ConfigurationDbContext - PullRequest
0 голосов
/ 24 мая 2018

Имея собственный класс Client в качестве IdSrvClient и реализуя следующий интерфейс для сопоставления его с базой данных

public class IdSrvClient : Client, IEntityBase
{
    //adding my extra properties
}

 public class IdSrvClientMap : IEntityTypeConfiguration<IdSrvClient>
    {
        public void Configure(EntityTypeBuilder<IdSrvClient> builder)
        {
            builder.ToTable("Client", "Security");
            //builder.HasQueryFilter(app => !app.IsDeleted);

            builder.Property(x => x.Id).ValueGeneratedOnAdd();

            builder.Property(x => x.ClientId).HasMaxLength(200).IsRequired();
            builder.Property(x => x.ProtocolType).HasMaxLength(200).IsRequired();
            builder.Property(x => x.ClientName).HasMaxLength(200);
            builder.Property(x => x.ClientUri).HasMaxLength(2000);
            builder.Property(x => x.LogoUri).HasMaxLength(2000);
            builder.Property(x => x.Description).HasMaxLength(1000);
            builder.Property(x => x.FrontChannelLogoutUri).HasMaxLength(2000);
            builder.Property(x => x.BackChannelLogoutUri).HasMaxLength(2000);
            builder.Property(x => x.ClientClaimsPrefix).HasMaxLength(200);
            builder.Property(x => x.PairWiseSubjectSalt).HasMaxLength(200);

            builder.HasIndex(x => x.ClientId).IsUnique();

            builder.HasMany(x => x.AllowedGrantTypes).WithOne(x => x.Client).IsRequired().OnDelete(DeleteBehavior.Cascade);
            builder.HasMany(x => x.RedirectUris).WithOne(x => x.Client).IsRequired().OnDelete(DeleteBehavior.Cascade);
            builder.HasMany(x => x.PostLogoutRedirectUris).WithOne(x => x.Client).IsRequired().OnDelete(DeleteBehavior.Cascade);
            builder.HasMany(x => x.AllowedScopes).WithOne(x => x.Client).IsRequired().OnDelete(DeleteBehavior.Cascade);
            builder.HasMany(x => x.ClientSecrets).WithOne(x => x.Client).IsRequired().OnDelete(DeleteBehavior.Cascade);
            builder.HasMany(x => x.Claims).WithOne(x => x.Client).IsRequired().OnDelete(DeleteBehavior.Cascade);
            builder.HasMany(x => x.IdentityProviderRestrictions).WithOne(x => x.Client).IsRequired().OnDelete(DeleteBehavior.Cascade);
            builder.HasMany(x => x.AllowedCorsOrigins).WithOne(x => x.Client).IsRequired().OnDelete(DeleteBehavior.Cascade);
            builder.HasMany(x => x.Properties).WithOne(x => x.Client).IsRequired().OnDelete(DeleteBehavior.Cascade);
        }
    }

с этим DbContext, Ef не может сгенерировать имя схемы, которое я явно передаю

  public class IdSrvConfigurationDbContext : ConfigurationDbContext
    {
        public IdSrvConfigurationDbContext(DbContextOptions<ConfigurationDbContext> options, ConfigurationStoreOptions storeOptions) : base(options, storeOptions)
        {
        }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);

            modelBuilder.ApplyConfiguration(new IdSrvClientMap());
        }
    }

Он добавляет дополнительные столбцы, которые я хочу для своих таблиц, но не изменяю схему.Что здесь не так?

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

Я создал свой собственный DesignTimeDbContextFactoryBase, и там вы можете установить DefaultSchema, я попытался добавить это в OnConfiguring, когда я писал в вопросе, но я не мог заставить его работать таким образом

public class IdSrvDbContextFactory : DesignTimeDbContextFactoryBase<IdSrvConfigurationDbContext>
{
    #region Methods

    protected override IdSrvConfigurationDbContext CreateNewInstance(DbContextOptions<IdSrvConfigurationDbContext> options)
    {
        var confOptions = new ConfigurationStoreOptions
        {
            DefaultSchema = "Security"
        };

        return new IdSrvConfigurationDbContext(options, confOptions);
    }

    #endregion
}
0 голосов
/ 24 мая 2018

Если вы используете ядро ​​EF, укажите схему по умолчанию

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.HasDefaultSchema("MyDefaultDbSchema");
    }

Также в IdentityServer4 в большинстве случаев вы можете обойтись без расширения базового клиента.Например, используя таблицу ClientProperty для сохранения необходимых данных.В противном случае я бы предложил создать новую схему с дополнительной таблицей, ссылающейся на clientId.

...