Как сопоставить тип с Nhibernate (и свободно NHibernate) - PullRequest
2 голосов
/ 04 октября 2009

Допустим, у меня есть что-то похожее на это:

public class DataType
{
    //For NHibernate
    private DataType(){}

    public DataType(string name, Type type, string defaultValue)
    {
        Name = name;
        TypeOfContent = type;
        DefaultInvariantStringValue = defaultValue;
    }

    public string Name { get; set; }
    public Type TypeOfContent { get; set; }
    public string DefaultInvariantStringValue { get; set; }
}

Как мне сопоставить свойство TypeOfContent с NHibernate (было бы желательно получить свободное отображение)?

Я бы ограничил тип C # встроенными типами например. string, int, datetime и т. д. Поэтому я хотел бы сохранить System.String (для строки) в базе данных

Ответы [ 3 ]

2 голосов
/ 06 октября 2009

Мне любопытно, почему бы тебе не сделать это вместо этого

public class DataType
{       
    ...        
    private string _typeOfContent;
    public virtual Type TypeOfContent
    {
        get { return Type.GetType(_typeOfContent); }
        set { _typeOfContent = value.FullName; }
    }   
}

...

public class DataTypeMap : ClassMap<DataType>
{
    Map(x => x.TypeOfContent)
       .Access.CamelCaseField(Prefix.Underscore)
       .CustomType<string>();
}
2 голосов
/ 26 ноября 2009

Мне интересно, не слишком ли это продумано? Разве вы не можете просто сопоставить тип как свойство?

public class DataTypeMap : ClassMap<DataType>
{
   public DataTypeMap()
   {
      // ...
      Map(x => x.TypeOfContent);
   }
}

В sqlite по крайней мере это будет соответствовать столбцу TEXT, в котором будет храниться AssemblyQualifiedName.

Соответствующий hbm.xml находится здесь:

<property name="Type" type="System.Type, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
  <column name="Type" />
</property>

Мне также интересен дополнительный вопрос о том, как элегантно отобразить значение по умолчанию. В sqlite, по крайней мере, нет «строгой типизации» столбца (я, вероятно, использую неправильную терминологию, см. Ссылку), поэтому на уровне базы данных, по крайней мере, должна быть возможность просто иметь объект DefaultValue и persist / depersist без потери точности. Однако остается открытым вопрос о том, как создать для этого отображение, которое NHibernate поймет .

0 голосов
/ 04 октября 2009

Я постараюсь ответить на свой вопрос, но надеюсь, что есть другой (более простой / понятный) способ.

Я думаю, что я мог бы изменить тип свойства TypeOfContent на что-то вроде BuiltInType (пользовательский класс-обертка Type), чтобы он мог реализовать IUserType.

Тогда я мог бы использовать эту технику: http://blog.jagregory.com/2009/01/11/fluent-nhibernate-auto-mapping-type-conventions/

Редактировать 1: Мне не нравится это решение , потому что оно заставляет меня добавить зависимость (IUserType) от NHibernate на мою модель.

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