У меня интересная ситуация с настройкой 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
, описанного выше в моих классах конфигурации.