Базовые модели и производные модели в MVC - PullRequest
0 голосов
/ 08 июня 2011

Я собираю приложение MVC, где я создал базовую модель, которая затем имеет четыре производных модели, каждая из которых наследуется от базовой модели:

public abstract class BaseFund
{
    public string Name { get; set; }
    public int AccountId { get; set; }
    public abstract decimal Value { get; }
    public virtual InvestmentAccount Account { get; set; }
}

одна из производных моделей:

public class ShareFund : BaseFund
{
    public string ISIN { get; set; }
    public ShareFundType FundType { get; set; }
    public IncomeStatus IncomeStatus { get; set; }
    public decimal TotalShares {
        get
        {
            ICollection<ShareTransaction> tt = this.Transactions;
            var outgoings = Transactions.Count > 0 ? Transactions.Where(t => t.TransactionType.IsOutgoing.Equals(true)).Sum(a => a.Units) : 0;
            var incomings = Transactions.Count > 0 ? Transactions.Where(t => t.TransactionType.IsOutgoing.Equals(false)).Sum(a => a.Units) : 0;
            return incomings - outgoings;
        }
    }
    public override decimal Value
    {
        get
        {
            return this.TotalShares * (this.SharePrice / 100);
        }
    }
    public decimal SharePrice { get; set; }
    public ICollection<ShareTransaction> Transactions { get; set; }
}

И есть еще три аналогичные производные модели. Все модели являются POCO, используемыми Entity Framework.

РЕДАКТИРОВАТЬ: на данном этапе представление является стандартным материалом строительных лесов MVC:

<table>
<tr>
    <th>
        Name
    </th>
    <th>
        Account
    </th>
    <th>
        Value
    </th>
    <th></th>
</tr>

@foreach (var item in Model) {
<tr>
    <td>
        @Html.DisplayFor(modelItem => item.Name)
    </td>
    <td>
        @Html.DisplayFor(modelItem => item.Account.AccountNumber)
    </td>
    <td>            
        @Html.DisplayFor(modelItem => item.Value)
    </td>
    <td>
        @Html.ActionLink("Edit", "Edit", new { id=item.Id }) |
        @Html.ActionLink("Details", "Details", new { id=item.Id }) |
        @Html.ActionLink("Delete", "Delete", new { id=item.Id })
    </td>
</tr>
}
</table>

То, что я хочу сделать, - это создать представление, отображающее поля из базового фонда (имя, идентификатор учетной записи и значение). Проблема заключается в том, что логика, определяющая значение, различна для каждой производной модели - в случае ShareFund она использует TotalShares, поэтому базовый фонд, используемый в представлении, должен быть приведен к типу ShareFund. Другие производные модели не обязательно имеют TotalShares как свойство.

Имея это в виду:

  • Является ли использование наследования с моделями таким способом? Если да, то как получить поля, относящиеся к производным моделям в представлении?
  • Если использование наследования не рекомендуется для этого типа сценария, что я должен использовать вместо него?

Спасибо

1 Ответ

0 голосов
/ 08 июня 2011

Оказался простой ответ на этот вопрос.Одно из свойств Transaction ниже по цепочке не заполнялось из базы данных EF.Это означало, что TransactionType было нулевым, что привело к ошибке нулевого задания в TotalShares.Я неверно истолковал это как значение проблемы со свойством, поскольку оно принадлежало производной модели, а не базовой модели.

Спасибо, Лазарь, ваш комментарий привел меня к этой проблеме.

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