Возврат ViewModel прекрасно работает в запросе EF, возвращающем список сущностей, но не при возврате единой сущности - PullRequest
0 голосов
/ 27 марта 2020

У меня есть метод в Asp. Net Core Api для вставки нового объекта, который получает ViewModel в качестве аргумента и возвращает другой ViewModel в качестве результата.

Я добавил метод Set () как одно из его свойств, возвращающее список CreditUserViewModel, и оно работает нормально.

    public async Task<IEnumerable<CreditUserViewModel>> GetAll()
    {
        return await Task.Run(() =>
            _context.Credit
                .Select(CreditUserViewModel.Set));
    }

Но хотя я хочу вернуть один объект, у меня нет доступа к методу Set (). Почему?

Результат ViewModel:

public class CreditUserViewModel
{
    public string PlanTitle { get; set; }
    public string CardSerial { get; set; }
    public DateTime PurchaseDate { get; set; }
    public int ValidationDays { get; set; }
    public int PaidAmount { get; set; }
    public string PurchaseCode { get; set; }
    public static CreditUserViewModel Set(Credit credit)
    {
        return new CreditUserViewModel
        {
            PlanTitle = credit.CreditPlan.Title,
            CardSerial = credit.Card.SerialNumber,
            PurchaseDate = DateTime.UtcNow,
            ValidationDays = credit.CreditPlan.ValidationDays,
            PaidAmount = credit.CreditPlan.Cost,
            PurchaseCode = credit.PurchaseCode
        };
    }
}

Добавить () метод, который я ожидаю вернуть один CreditUserViewModel:

    public async Task<CreditUserViewModel> Add(CreditRegisterViewModel credit)
    {
        var newCredit = new Credit
        {
            CardId = credit.CardId,
            CreditPlanId = credit.CreditPlanId,
            PurchaseCode = credit.PurchaseCode,
            RechargeDate = DateTime.UtcNow
        };

        _context.Entry(newCredit).State = EntityState.Added;

        try
        {
            await _context.SaveChangesAsync();
        }
        catch
        {
            throw new Exception();
        }

        return new CreditUserViewModel.Set(newCredit); **// Error is in this line: The type name Set does not exist in the type CreditUserViewModel**
    }

Сообщение об ошибке: имя типа Set не существует в типе CreditUserViewModel

1 Ответ

1 голос
/ 27 марта 2020

Не должно ли это быть что-то вроде:

public async Task<IEnumerable<CreditUserViewModel>> GetAll()
{
    var data = _context.Credit
                       .Select( c => CreditUserViewModel.Set(c) )
                       .ToList();

    return Task.FromResult(data);
}

И это

 return new CreditUserViewModel.Set(newCredit);

должно быть

 return CreditUserViewModel.Set(newCredit);

Так как CreditUserViewModel.Set является методом, не тип, и по соглашению обычно будет называться Create вместо конструктора. Или реализован как метод расширения, называемый ToViewModel(), предназначенный для типа сущности, например:

public static CreditUserViewModel ToViewModel(this CreditUser entity)
{
  ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...