Как я могу получить доступ к связанным данным и преобразовать внешние ключи в объекты для отображения их свойств - PullRequest
0 голосов
/ 06 июня 2018

У меня есть

class User {
...
...
ICollection<Transaction> transactionsUserMade;
}

и

class Transaction {
int ID;
int userThatSentMoneyID;
int userToWhomHeSentMoneyID;
}

Я пытаюсь создать страницу профиля, где пользователь может видеть все свои транзакции и кому.Мне удалось связать пользователей и транзакции, но я получаю целочисленные значения, как я должен, используя

await _context.Users
    .Include(u => u.transactionsUserMade)
    .AsNoTracking()
    .FirstOrDefaultAsync(u => u.ID == userId);

Как я могу превратить эти идентификаторы в реальные объекты пользователей, чтобы я мог получить их имена пользователей и отобразить их наБритва Пейдж.

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

Вы можете использовать Navigation Property, чтобы помочь вам в этом, если вы можете изменить эти модели сущностей User и Transaction.

public class UserEntity
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Email { get; set; }

    public List<TransactionEntity> TransactionsAsSender { get; set; }
    public List<TransactionEntity> TransactionsAsRecipient { get; set; }
}

public class TransactionEntity
{
    public int Id { get; set; }
    public double Amount { get; set; }
    public string Note { get; set; }

    // Foreign key to UserEntity
    public int SenderId { get; set; }
    public UserEntity Sender { get; set; }

    // Foreign key to UserEntity
    public int RecipientId { get; set; }
    public UserEntity Recipient { get; set; }
}

Затем вам нужно настроить их отношения.

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

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

        builder.Entity<UserEntity>(b => {
            b.HasKey(x => x.Id);
            b.Property(x => x.Name).IsRequired();
            b.Property(x => x.Email).IsRequired();

            b.ToTable("User");
        });

        builder.Entity<TransactionEntity>(b => {
           b.HasKey(x => x.Id);
           b.Property(x => x.Amount).IsRequired();

           // Configure relationships
           b.HasOne(x => x.Sender)
               .WithMany(u => u.TransactionsAsSender)
               .HasForeignKey(x => x.SenderId);

           b.HasOne(x => x.Recipient)
               .WithMany(u => u.TransactionsAsRecipient)
               .HasForeignKey(x => x.RecipientId);

           b.ToTable("Transaction");
        });
    }

    public DbSet<UserEntity> Users { get; set; }
    public DbSet<TransactionEntity> Transactions { get; set; }
}

После того, как их отношения настроены, вы можете легко запросить соответствующие данные с помощью свойств навигации.

Например, предположим, у вас есть модель представления с именами UserProfileViewModel и UserProfileTransactionViewModel для храненияинформация, необходимая для отображения.

public class UserProfileViewModel
{
    public int UserId { get; set; }
    public string UserName { get; set; }
    public string UserEmail { get; set; }

    public IEnumerable<UserProfileTransactionViewModel> TransactionsAsSender { get; set; }
    public IEnumerable<UserProfileTransactionViewModel> TransactionsAsRecipient { get; set }
}

public class UserProfileTransactionViewModel
{
    public int TransactionId { get; set; }
    public string Sender { get; set; }
    public string Recipient { get; set; }
    public string Amount { get; set; }
}

В контроллере,

var user = _dbContext.Users
    .AsNoTracking()
    .Include(x => x.TransactionsAsSender)
    .Include(x => x.TransactionsAsRecipient)
    .SingleOrDefault(x => x.Id == userId);

if (user == null)
{
    return NotFound();
}

var vm = new UserProfileViewModel
{
    UserId = user.Id,
    UserName = user.Name,
    UserEmail = user.Email,
    TransactionsAsSender = user.TransactionsAsSender
        .Select(x => new UserProfileTransactionViewModel
        {
            TransactionId = x.Id,
            Sender = x.Sender.Name,
            Recipient = x.Recipient.Name,
            Amount = x.Amount.ToString("c")
        }),
    TransactionsAsRecipient = user.TransactionsAsRecipient
         .Select(x => new UserProfileTransactionViewModel
        {
            TransactionId = x.Id,
            Sender = x.Sender.Name,
            Recipient = x.Recipient.Name,
            Amount = x.Amount.ToString("c")
        })      
};

return View(vm);

Вы могли бы даже просто отключить список всех транзакций UserProfileViewModel.Вы можете комбинировать TransactionsAsSender и TransactionsAsRecipient из UserEntity, чтобы заполнить список.

Отказ от ответственности:

Я написал все от руки и с моим воображением: p

0 голосов
/ 06 июня 2018

Нашел одно решение.Я подправил класс Transaction, добавив свойство User userThatRecievedMoney.И после получения транзакций от конкретного пользователя я вручную установил это свойство.

foreach(var transaction in _user.transactionsUserMade)
{
    transaction.userThatRecievedMoney = _context.Users
       .Where(u => u.ID == transaction.userToWhomHeSentMoneyID).FirstOrDefault();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...