Текущее сопоставление компонентов NHibernate - строковое значение БД, передаваемое фабрике, дает требуемый тип объекта - PullRequest
0 голосов
/ 16 апреля 2009

Таблица:

CREATE TABLE Instrument
(   Id              INT IDENTITY
,   Name            VARCHAR(50)
,   Tenor           VARCHAR(10)
//...

Модель:

    interface ITenor
    {
        int Length { get; }
        string ToString();
    }

    class DayTenor : ITenor
    {
        public int Length
        {
            get { return 1; }
        }

        public override string ToString()
        {
            return "DAY";
        }
    }

    class MonthTenor : ITenor
    {
        public int Length
        {
            get { return 30; }
        }

        public override string ToString()
        {
            return "MONTH";
        }
    }

    class TenorFactory
    {
        ITenor GetTenor(string tenorString)
        {
            switch (tenorString)
            {
                case "DAY":
                    return new DayTenor();
                    break;
                case "MONTH":
                    return new MonthTenor();
                    break;
                default:
                    throw new NotImplementedException(string.Format( "Tenor {0} is not implemented", tenorString ));
            }
        }
    }

    class Instrument
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public ITenor Tenor { get; set; }
    }

    class InstrumentMap : ClassMap<Instrument>
    {
        public InstrumentMap()
        {
            WithTable( "Instrument" );
            Id( x => x.Id );
            Map( x => x.Name );
            Map( x => x.Tenor );
        }
    }

Это большое упрощение проблемной области.

Строка Map( x => x.Tenor ); явно не будет работать, поскольку вы не можете неявно преобразовать столбец VARCHAR в тип ITenor. Можно ли сопоставить способ автоматического использования Factory для получения ITenor, который требуется для указанной строки в БД, и использования ToString () из класса ITenor для возврата обратно в БД?

Если нет, то какой рефакторинг вы бы порекомендовали сделать это осуществимым? Большое спасибо

1 Ответ

2 голосов
/ 16 апреля 2009

Возможное решение - сохранить строку в том виде, в каком она есть в базе данных, и сопоставить ее со свойством TenorString. Затем добавьте другое типизированное свойство, которое просто выполняет преобразование между строкой и типизированным значением:

class Instrument
{
    public string TenorString { get; set; }
    public ITenor Tenor { 
        get { return GetTenor(this.TenorString); } 
        set { TenorString = value.ToString() }; 
    }
}

TenorString отображается как обычно, но свойство Tenor не отображается вообще:

Map( x => x.TenorString );

Конечно, свойство Tenor get может возвращать кэшированное значение, которое сбрасывается при изменении TenorString, чтобы каждый раз избегать вызова фабрики.

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