2013-09-26 2 views
0

У меня есть база данных (которая не может быть изменена) с целым грузом ценностей, которые хранятся в двух столбцах:NHibernate - Карта несколько столбцов базы данных для одного объекта

В настоящее время каждый столбец отображается одно свойство, и мой домен объект выглядит следующим образом:

int? Value1 
bool IsValue1RealValue 

string Value2 
bool IsValue2RealValue 

bool? Value3 
bool IsValue3RealValue 

Я хочу поставить тех, кто в ValueType, который будет содержать 2 или 3 значения:

-The значение (хранится в object или в T)
-The булевой '' RealValue
-(необязательно) имя имени свойства .NET

В настоящее время у меня есть следующий: отображение NHibernate

Component(x => x.Value1, fdf => 
    { 
    fdf.Map(f => f.Value).Column("Value1"); 
    fdf.Map(f => f.IsRealValue).Column("IsValue1RealValue"); 
    }); 

Value1 имеет следующий вид:

public class FlaggedNullableIntValue 
{ 
    public int? Value; 
    public bool IsRealValue; 
} 

Мой объект домен будет выглядеть:

public class DomainEntity 
{ 
    public virtual FlaggedNullableIntValue Value1; 
    public virtual FlaggedStringValue Value2; 
    public virtual FlaggedNullableBooleanValue Value3; 
} 

Интересно, стоит ли идти дальше по этой дороге или есть еще одна конструкция, которая может лучше соответствовать моим потребностям?

+0

Я не думаю, что понимаю. Как вы хотите, чтобы ваша модель выглядела? Где есть те 'T' или' objects', если тип 'Value' является' int? '? Какое имя свойства вы хотите отобразить? – NOtherDev

+0

Я обновил свой вопрос. Модель будет иметь 1 свойство для каждой комбинации Value + IsRealValue в базе данных. Значение в настоящее время остается int, но в идеале сопоставленный объект сможет обрабатывать ints, bools и строки как Type for Value. – Laoujin

+0

Вы спрашиваете, имеет ли nHibernate функцию, которая преобразует столбцы в строки (объекты)? Если это так, я уверен, что это невозможно. Вам необходимо сопоставить каждую пару вручную. – igelineau

ответ

1

Я думаю, что вы находитесь на правильном пути. Одно предложение - вы должны иметь возможность создать свой класс FlaggedNullable*Value, чтобы вам не приходилось создавать множество разных классов.

public class FlaggedNullableValue<T> 
    where T : struct 
{ 
    public T? Value; 
    public bool IsRealValue; 
} 

Похоже, что вы используете Fluent NHibernate для указания ваших сопоставлений. Если вы согласны с тем, как вы называете эти пары столбцов, вы должны иметь возможность создать соглашение, чтобы облегчить перенос всех этих свойств и имен столбцов.

+0

Мы закончили использование 'ICompositeUserType' (согласно вашему комментарию). До сих пор он работает очень хорошо. – Laoujin

Смежные вопросы