Допустим, я добавил несколько дополнительных свойств к пользователю по умолчанию при использовании идентификатора asp.net:

public class ApplicationUser : IdentityUser
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

Я знаю, что в моем контроллере asp.net MVC я могу просто сделать следующее, чтобы получить имя текущего зарегистрированного пользователя:

User.Identity.Name

Поэтому при сохранении в базу данных я могу просто передать User.Identity.Name в мой репозиторий вместе с сохраняемым объектом, чтобы можно было заполнить поле CreatedBy.

Теперь предположим, что я получаю элементы из базы данных, у которых есть поле CreatedBy, содержащее строку имени пользователя, но я хочу отобразить Created by: FirstName + LastName в представлении.

Как мне получить эту дополнительную информацию? Если бы я использовал чистый SQL, я бы сделал INNER JOIN в таблице AspNetUsers, где CreatedBy = Username, и просто получил бы FirstName и LastName в настраиваемом столбце CreatedByFullName.

Поскольку сейчас я использую Entity Framework вместе с последней версией ASP.NET Identity, я немного смущен тем, как мы должны получать информацию о пользователях для отображения в представлении наших страниц. Вопрос в том, чтобы выполнить соединение с linq в моем репозитории или просто добавить объект к каждому из моих свойств с именем ApplicationUser, или есть лучшие способы?

0
Blake Rivell 28 Фев 2016 в 10:07

2 ответа

Лучший ответ

Предположения:

  • У вас есть одна таблица под названием ApplicationUser, которая содержит всех ваших пользователей.
  • В этой таблице есть столбец Id (целое число), который вы повторно используете для хранения результатов поиска в других таблицах.

Другие классы (то, что я называю свойствами однонаправленной навигации):

public class BookContext : DbContext
{
    public DbSet<Book> Books { get; set; }
    public Dbset<ApplicationUser> Users { get; set; }

    public overridee OnModelCreating(DbModelBuilder modelBuilder)
    {
      modelBuilder.Entity<Book>()
        .HasRequired(b => b.CreatedByUser)
        .WithMany()
        .HasForeignKey(b => b.CreatedBy);
    }
}

public class Book
{
  public int CreatedBy { get; set; }
  public virtual ApplicationUser CreatedByUser { get; set; }
}

Тогда ты бы просто

using (var bookContext = new BookContext())
{
  var firstBookWithRelatedUser bookContext.Books
    .Include(b => b.CreatedByUser)
    .First();
}

Что-то такое. Я рекомендую прочитать документацию по Entity Framework. Принимая во внимание приведенный выше код, я в значительной степени просто списал со счетов, поэтому, возможно, я не совсем прав.

Если хотите, то, что я называю, свойства двунаправленной навигации:

public class ApplicationUser : IdentityUser
{
  public string FirstName { get; set; }
  public string LastName { get; set; }
  public ICollection<Book> Books { get; set; }
}

Тогда

    public overridee OnModelCreating(DbModelBuilder modelBuilder)
    {
      modelBuilder.Entity<Book>()
        .HasRequired(b => b.CreatedByUser)
        .WithMany(u => u.Books)
        .HasForeignKey(b => b.CreatedBy);
    }

Тогда ты бы просто

using (var bookContext = new BookContext())
{
  var firstUserWithAllRelatedBooks = bookContext.Users
    .Include(u => u.Books)
    .First();
}

Это действительно зависит от ваших потребностей. Но будьте осторожны, вы можете получить гигантский Бог DbContext, то есть в курсе всех отношений ...

2
Erik Philips 28 Фев 2016 в 08:11

Пример запроса EF будет выглядеть ниже -

var result = (from tab in db.YourTable
            join user in db.AspNetUsers on user.username equals tab.CreatedBy                
            select new {YourTableObj = tab, CreatedByFullName = user.FirstName + " " + user.LastName).ToList();
0
Vinit 28 Фев 2016 в 07:18