Таблицы карт с использованием свободного api в asp.net MVC5 EF6?
Я пытаюсь добавить информацию о профиле/членстве в мое приложение MVC5 и добавлять сопоставления конфигурации.
Появляется следующее сообщение об ошибке:
my.Models.IdentityUserLogin:: EntityType 'IdentityUserLogin' не имеет ключ определен. Определите ключ для этого EntityType.
my.Models.IdentityUserRole:: EntityType 'IdentityUserRole' не имеет ключа определены. Определите ключ для этого EntityType.
IdentityUserLogins: EntityType: EntitySet 'IdentityUserLogins' является основанный на типе "IdentityUserLogin", который не имеет определенных ключей.
IdentityUserRoles: EntityType: EntitySet 'IdentityUserRoles' основан на тип "IdentityUserRole", который не имеет определенных ключей.
public class ApplicationUser : IdentityUser
{
public string City { get; set; }
public string Discriminator { get; set; }
public string Address { get; set; }
}
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext()
: base("DefaultConnection")
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new ApplicationUserConfiguration());
}
}
Ответы
Ответ 1
Вызов base.OnModelCreating(modelBuilder)
не решил проблему для меня.
Поведение Microsoft.AspNet.Identity.EntityFramework, похоже, отличается в VS2013-Preview, VS2013-RC и VS2013-RTM. Я использую версию RTM.
После наследования от IdentityUser мне пришлось воссоздать все остальные первичные ключи в модели, чтобы заставить ее работать:
public class ApplicationUser : IdentityUser
{
public string DisplayName { get; set; }
}
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext() : base("DefaultConnection") { }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<IdentityUserLogin>().HasKey<string>(l => l.UserId);
modelBuilder.Entity<IdentityRole>().HasKey<string>(r => r.Id);
modelBuilder.Entity<IdentityUserRole>().HasKey(r => new { r.RoleId, r.UserId });
}
(см. Настройка/отображение свойств и типов с помощью Fluent API)
Я думаю, работа над AspNet.Identity.EntityFramework продолжается, и это будет исправлено (?)
Ответ 2
Вызов base.OnModelCreating(modelBuilder)
после добавления конфигурации.
Ответ 3
Следуйте этим шагам по методу OnModelCreating
и испытайте после того, как каждый из них осознает, что он вступает в силу:
- Удостоверьтесь, что у вас есть один
Context
, чтобы предотвратить их конфликты с правилами.
- Вызов
base.OnModelCreating(modelBuilder);
внутри указанного
метод (прежде всего)
- Добавьте следующий шаг плюс шаг предварительного просмотра в методе:
modelBuilder.Entity<IdentityUserLogin>().HasKey<string>(l => l.UserId);
modelBuilder.Entity<IdentityRole>().HasKey<string>(r => r.Id);
modelBuilder.Entity<IdentityUserRole>().HasKey(r => new { r.RoleId, r.UserId });