Как добавить ссылку на внешний ключ для идентификации 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]()
Ответы
Ответ 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]()