Как правильно настроить ASP. NET Идентичность, чтобы я мог поддерживать два контекста БД? - PullRequest
1 голос
/ 25 января 2020

У меня интересная ситуация с настройкой ASP. NET Идентификационные сущности. Независимо от того, что я добавляю в классы конфигурации для своих сущностей, я получаю сообщение об ошибке «Недопустимое имя столбца ApplicationUser_Id».

Вот некоторые подробности о моей архитектуре:

  • Я настроил свои ASP. NET Идентификационные объекты таким образом, чтобы тип данных их первичных ключей был int (с исключение AspNetUserLogins и AspNetUserRoles, которые оба используют составные первичные ключи).
  • Я попытался создать архитектуру, в которой мой контекст неидентичности (назовем его контекстом моего домена) наследуется от моего контекста идентичности, который, конечно, наследует от DbContext. Я сделал это так, чтобы мой контекст домена мог обращаться к сущностям в моем контексте идентичности, но не наоборот. (Поправьте меня, если это плохая идея.)
  • Мои сущности Identity не добавляют никаких дополнительных свойств к тому, что ASP. NET Identity уже вставило (и при этом они не удаляют их). Единственная настройка здесь заключается в том, что первичные ключи являются целыми числами, как указано ранее.

Мой контекст идентификации:

 public class IdentityDbContext : IdentityDbContext<ApplicationUser, AppRole, int, AppUserLogin, AppUserRole, AppUserClaim>
    {
        public IdentityDbContext()
            : base("connectionString")
        {
        }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            //Configuration for ASP.NET Identity entities
            modelBuilder.Configurations.Add(new AppUserLoginConfiguration());
            modelBuilder.Configurations.Add(new AppUserRoleConfiguration());
            modelBuilder.Configurations.Add(new ApplicationUserConfiguration());
            modelBuilder.Configurations.Add(new AppRoleConfiguration());
            modelBuilder.Configurations.Add(new AppUserClaimConfiguration());
        }
    }

Контекст моего домена:

public class DbContext : IdentityDbContext, IDbContext
    {
        public DbSet<EventLog> EventLogs { get; set; }
        public DbSet<Site> Sites { get; set; }
        public DbSet<Listing> Listings { get; set; }

        public DbContext()
        {
        }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
            modelBuilder.Configurations.Add(new EventLogConfiguration());
            modelBuilder.Configurations.Add(new SiteConfiguration());
            modelBuilder.Configurations.Add(new ListingConfiguration());

            //non-fluent configuration
            //modelBuilder.Entity<ApplicationUser>().HasKey(k => k.Id).ToTable("AspNetUsers", "dbo");
            //modelBuilder.Entity<AppUserLogin>().HasKey(k => k.Id).ToTable("AspNetUserLogins", "dbo");
            //modelBuilder.Entity<AppUserRole>().HasKey(k => k.Id).ToTable("AspNetUserRoles", "dbo");
            //modelBuilder.Entity<AppRole>().HasKey(k => k.Id).ToTable("AspNetRoles", "dbo");
            //modelBuilder.Entity<AppUserClaim>().HasKey(k => k.Id).ToTable("AspNetUserClaims", "dbo");
        }

        public static DbContext Create()
        {
            return new DbContext();
        }

    }
}

Конфигурации объекта идентификации:

public class ApplicationUserConfiguration : EntityTypeConfiguration<ApplicationUser>
    {
        public ApplicationUserConfiguration()
        {
            ToTable("AspNetUsers", "dbo");
            HasKey(k => k.Id);
        }
    }

 public class AppRoleConfiguration : EntityTypeConfiguration<AppRole>
    {
        public AppRoleConfiguration()
        {
            ToTable("AspNetRoles", "dbo");
            HasKey(k => k.Id);
        }
    }

public class AppUserClaimConfiguration : EntityTypeConfiguration<AppUserClaim>
    {
        public AppUserClaimConfiguration()
        {
            ToTable("AspNetUserClaims", "dbo");
            HasKey(k => k.Id);
        }
    }

 public class AppUserLoginConfiguration : EntityTypeConfiguration<AppUserLogin>
    {
        public AppUserLoginConfiguration()
        {
            ToTable("AspNetUserLogins", "dbo");
            HasKey(k => new { k.LoginProvider, k.ProviderKey, k.UserId });
        }
    }

public class AppUserRoleConfiguration : EntityTypeConfiguration<AppUserRole>
    {
        public AppUserRoleConfiguration()
        {
            ToTable("AspNetUserRole", "dbo");
            HasKey(k => new { k.RoleId, k.UserId });            
        }
    }

Объект домена конфигурации:

public class EventLogConfiguration : EntityTypeConfiguration<EventLog>
    {
        public EventLogConfiguration()
        {
            ToTable("EventLog", "Core");
            HasKey(k => k.Id);
        }
    }

public class ListingConfiguration : EntityTypeConfiguration<Listing>
    {
        public ListingConfiguration()
        {
            ToTable("Listings", "Catalog");
            HasKey(k => k.Id);
        }
    }

public class SiteConfiguration : EntityTypeConfiguration<Site>
    {
        public SiteConfiguration()
        {
            HasKey(k => k.Id);
            ToTable("Sites", "Site");
        }
    }

Конфигурации сущностей для моих сущностей домена работают просто отлично, но конфигурации для моих сущностей Identity, похоже, не работают. Как вы можете видеть выше, я не добавляю столбец с именем «ApplicationUser_Id» ни в одну из сущностей Identity или их конфигураций. Я сослался на этот вопрос , но даже после попытки предложить предложенный ответ мне не удалось исправить эту ошибку.

Вот строка кода, которую разрывает мое приложение в контроллере учетной записи:

.
.
.
var result = await SignInManager.ExternalSignInAsync(loginInfo, isPersistent: false);
.
.
.

Любая помощь очень ценится. Если я могу добавить больше информации, пожалуйста, дайте мне знать. Я застрял в этом вопросе на пару ночей, поэтому я с нетерпением жду, чтобы исправить это. Спасибо!

Редактировать: Резюмируя вопрос

Моя проблема в том, что ASP. NET Идентификация ищет столбец базы данных с именем «ApplicationUser_Id» в таблице ApplicationUser. Почему Identity ищет этот столбец базы данных, когда, как вы можете видеть из моих классов конфигурации выше, этот столбец не существует. Я даже использую метод HasKey, где я устанавливаю ключ к правильному столбцу (Id). Я что-то упускаю в любом из моих классов контекста или что-то упускаю в моих классах конфигурации?

Таблицы идентификации были включены в схему dbo моей базы данных по умолчанию, поэтому я оставил их там. Имя схемы - это второй параметр метода ToTable, описанного выше в моих классах конфигурации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...