У меня очень странная проблема, которую я не могу объяснить. У меня есть базовое отображение с этим
//This will automatically cast the row into the correct object type based on the value in AccountType
DiscriminateSubClassesOnColumn<string>("AccountType")
.Formula(String.Format("CASE AccountType WHEN {0} THEN '{1}' WHEN {2} THEN '{3}' ELSE '{4}' END",
(int)PaymentMethodType.CheckingAccount,
typeof(ACH).Name,
(int)PaymentMethodType.SavingsAccount,
typeof(ACH).Name,
typeof(CreditCard).Name));
Я посмотрел в журналах, я выполнил sql, который генерирует nhibernate, и все записи имеют одинаковые данные. В них нет разницы, которая бы обозначала, почему это не должно работать.
Базовый класс - PaymentMethodBase. У меня есть 2 подкласса, CreditCard и ACH, которые наследуются от PaymentMethodBase.
Тогда у меня есть это расширение
public static string PaymentMethodName(this PaymentMethodBase paymentMethod)
{
if (paymentMethod is ACH)
{
var ach = (ACH)paymentMethod;
return String.Format("{0} {1}", ach.BankName, String.Format("XXXX{0}", ach.AccountNumber.Substring(ach.AccountNumber.Length - 4)));
}
if (paymentMethod is CreditCard)
{
var creditCard = (CreditCard)paymentMethod;
return String.Format("{0} {1}", creditCard.Name, creditCard.CreditCardNumber);
}
return "Unknown Payment Method";
}
Который я так называю.
public SelectList PaymentMethodsSelectList
{
get
{
var methods = (from p in PaymentMethods
where p != null
select new
{
id = p.PaymentMethodId,
name = p.PaymentMethodName()
}).OrderBy(x => x.name);
var results = methods.ToList();
results.Insert(0, new { id = (int)NewPaymentMethods.ACH, name = "<New eCheck Account...>" });
results.Insert(0, new { id = (int)NewPaymentMethods.CreditCard, name = "<New Credit Card...>" });
return new SelectList(results, "id", "name");
}
}
Этот код используется 2 моделями. Все способы оплаты поступают из одного и того же объекта - объекта клиента. Коллекция отображается следующим образом.
HasMany<PaymentMethodBase>(x => x.PaymentMethods)
.KeyColumn("CustomerId")
.Where(y => y.AccountType < 10)
.Inverse()
.Cascade.All();
Итак, я получаю клиента двумя разными способами. Во-первых, я получаю клиента через другой объект (основной сайт). У другого есть объект, который тянет непосредственно по id (в iframe). Метод direct by id работает каждый раз. Другой метод, при котором я получаю клиента через другой объект, приводит к правильному приведению только первого и последнего метода оплаты. Если их больше 2, они остаются в базовом классе и появляются в середине списка после сортировки.
Я попытался изменить родительский объект, чтобы просто сопоставить идентификатор, а затем получить запись клиента по идентификатору. Провал. На этом пути есть что-то еще, но только на этой модели.