Личность пользователя FK - PullRequest
0 голосов
/ 04 февраля 2020

У меня есть приложение в Asp. NET Core 3.1 MVC с EF Core и Identity.

У меня есть две таблицы Calls и AspNetUsers. AspNetUsers имеет много Calls, а один Call имеет один AspNetUsers.

Структура таблицы Calls в порядке, я думаю. Но теперь мне нужно получить Calls от AspNetUsers.

В CallsController Я пытаюсь: IList<Call> calls = this.User.Calls;, но безуспешно.

Я пытался:

IList<Call> calls = this._context.Calls.Where(x => x.UserId == this._userManager.GetUserId(this.User)).ToList(); 

У меня есть успех. Но правильно ли это?

Итак, в приложении у меня есть классы идентичности и ApplicationUser, например:

public class ApplicationUser : IdentityUser
{
    public virtual IList<Call> Calls { get; set; }
}

И в Startup классе в методе ConfigureServices:

services.AddDefaultIdentity<ApplicationUser>(options => 
    options.SignIn.RequireConfirmedAccount = true)
    .AddEntityFrameworkStores<ApplicationDbContext>();

Итак, как лучше получать звонки от AspNetUsers? Спасибо!

Ответы [ 2 ]

1 голос
/ 05 февраля 2020

Вы можете установить ApplicationUser как:

public class ApplicationUser : IdentityUser
{
    public virtual ICollection<Call> Calls { get; set; }
}

Call.cs:

public class Call
{
    public int ID { get; set; }

    public string name { get; set; }

    // other properties

    public string UserID { get; set; }
    [ForeignKey("UserID")]
    public virtual ApplicationUser ApplicationUser { get; set; }
}

В ApplicationDbContext добавьте:

public virtual DbSet<Call> Calls { get; set; } //add this line 
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
    : base(options)
{
}

Тогда вы можете запросить вызов текущего пользователя по:

if (User.Identity.IsAuthenticated)
{
    var userID = User.Claims.FirstOrDefault(x => x.Type == ClaimTypes.NameIdentifier).Value;
    var calls = _applicationDbContext.Users.Include(u => u.Calls).First(u => u.Id == userID).Calls.ToList();

    //or
    var callsa = _applicationDbContext.Calls.Where(p => p.UserID == userID).ToList();
}
0 голосов
/ 07 февраля 2020

ApplicationUser должно быть

    public class ApplicationUser : IdentityUser
    {
       public virtual ICollection<Call> Calls { get; set; }
    }

Объект вызова должен быть

 public class Call
 {
    public int ID { get; set; }

    //...

    public string ApplicationUserId { get; set; }
    [ForeignKey(nameof(ApplicationUserId))]
    public virtual ApplicationUser ApplicationUser { get; set; }
 }

, и, конечно, вы должны переопределить метод OnModeCreating в вашем DbContext следующим образом

 public class ApplicationDbContext: DbContext
    {
        public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
            : base(options){}

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);

            modelBuilder.Entity<Call>()
                        .HasOne(x => x.ApplicationUser)
                        .WithMany(x => x.Calls);
        }

        //...DbSets..

     }

и, наконец, загрузите все ваши звонки в коллекцию звонков ApplicationUser

  var user = await _context.ApplicationUsers.FindAsync(_userManager.GetUserId(this.User));

  await context.Entry(user)
      .Collection(x => x.Calls)
      .LoadAsync();

Теперь все ваши звонки загружены в коллекцию звонков текущего пользователя.

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