Подтвердить что ты не робот

Как добавить ссылку на внешний ключ для идентификации ASP.Net MVC 5?

У меня есть новый проект ASP.NET MVC 5.1 с использованием идентификатора ASP.Net. Это кажется надежным и обещающим, но сегодня я трачу почти 9 часов, чтобы делать простые вещи, используя SQL.

Моя проблема в том, что я не могу создать таблицу через CodeFirst с ссылкой на внешний ключ для таблицы AspNetUsers по умолчанию.

Например: Я создал таблицу с именем - Адрес

   public class Address
    {
        [Key]
        public string UserId { get; set; }
        public string MyAddress { get; set; }
    }

Но как я могу создать ссылку внешнего ключа для AspNetUsers?

Я пытаюсь заменить свойство выше на

public IdentityUser MyAddress { get; set; }
// Or
public virtual IdentityUser MyAddress { get; set; }
// Or
public virtual ApplicationUser MyAddress { get; set; }

Но все они все еще показывают ошибку:

One or more validation errors were detected during model generation:

MiaPos.Models.IdentityUserLogin: : EntityType 'IdentityUserLogin' has no key defined. Define the key for this EntityType. 
MiaPos.Models.IdentityUserRole: : EntityType 'IdentityUserRole' has no key defined. Define the key for this EntityType. 
IdentityUserLogins: EntityType: EntitySet 'IdentityUserLogins' is based on type 'IdentityUserLogin' that has no keys defined. 
IdentityUserRoles: EntityType: EntitySet 'IdentityUserRoles' is based on type 'IdentityUserRole' that has no keys defined.

Я также пытаюсь переопределить OnModelCreating из этого сообщения

protected override void OnModelCreating(DbModelBuilder 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 });
}

Но когда я запускаю Add-Migration, он создает таблицы IdentityUserLogin, IdentityRole, IdentityUserRole и дублирует их, только префикс отличается. (ASPnet ↔ Идентичность)

Наконец, я делаю это через SQL за 10 секунд, но я просто хочу знать, почему я не могу сделать это в CodeFirst? И почему так сложно делать такие вещи из Microsoft 2014 New Technology.

enter image description here

4b9b3361

Ответ 1

Вы можете сделать это. потому что когда-нибудь вам понадобится 1-1 соединение

 public class AnotherTable
    {
        [Key]
        public string UserId { get; set; }

        [ForeignKey("UserId")]
        public virtual ApplicationUser User { get; set; }
    }

Ответ 2

Спасибо вам Gábor Plesz за комментарий выше.

Я нашел решение.

Класс ApplicationUser, который наследует IdentityUser (который создает таблицу AspNetUsers), должен создать свойство ICollection дочернего класса (дочерняя таблица).

например.

public virtual ICollection<ToDo> ToDoes { get; set; }

Таким образом, класс ToDo может ссылаться на ApplicationUser

Очень рекомендую посмотреть образец как Gábor Plesz.

enter image description here