Свободное отображение NHibernate - PullRequest
9 голосов
/ 26 августа 2009

Я новичок в NHibernate и свободно владею NHibernate.

Предполагая, что у меня есть ситуация, подобная следующей

Table Activities (uniquidentier ID, varchar ActivityName)
Table ActivityParameters(uniqueidentifier ID, varchar ParameterName,
 varbinary(8000) ParameterValue)

и следующий класс

public static Acivity
{
     .......
     public virtual Guid Id {get; private set;}      
     public virtual string ActivityName {get; private set;}
     public virtual IDictionary<string, object> ActivityParameters {get; private set;}
}

как я могу написать карту классов? Более конкретно, как я могу написать отображение для параметров активности?

Ответы [ 5 ]

16 голосов
/ 27 августа 2009

Коллега указал на этот сайт .

Исходя из этого обсуждения, я пришел к

Table("Activities");
        Id(x => x.Id).Column("ID").GeneratedBy.Guid();
        Map(x => x.ActivityName).Not.Nullable().Length(50);
        HasMany(x => x.ActivityParameters)
            .KeyColumn("ActivityID")
            .AsMap<string>(idx => idx.Column("ParameterName"), elem => elem.Column("ParameterValue"))
            .Not.LazyLoad()
            .ForeignKeyCascadeOnDelete()
            .Table("ActivityParameters");

Я должен это проверить.

0 голосов
/ 27 августа 2009

Пожалуйста, прости мое невежество.

Я работал с NHibernate около 6 месяцев назад, и все же мы выбирали отображение интеграции XML, затем компилировали отображения XML в библиотеке или что-то еще.

Это новое для отображения реляционных таблиц и объектов классов непосредственно из кода?

Я слышал, что это происходит как-то с выходом Entity Framework, определяя отображение только поверх каждого элемента класса в квадратных скобках. Таким образом, поскольку Entity Framework предназначен исключительно для использования с SQL Server, мы не могли думать об его использовании, поскольку работали в среде с несколькими БД с SQL Server, Oracle и SQLite.

Спасибо за любое освещение на эту тему! : -)

0 голосов
/ 27 августа 2009

На основании вашей подсказки я пришел к:

WithTable("Activities"); 
Id(x => x.Id).ColumnName("ID").GeneratedBy.Guid(); 
Map(x => x.ActivityName).Not.Nullable().WithLengthOf(50); 
HasMany(x => x.ActivityParameters) 
        .Cascade.Delete() 
        .KeyColumnNames.Add("ActivityID") 
        .AsMap("ParameterName") 
        .AsMap("ParameterValue") 
        .WithTableName("ActivityParameters");

но я получаю ошибку, Ассоциация ссылается на не сопоставленный класс: System.Object. (

Позже редактирование: я получил последнюю версию Fluent, и теперь код выглядит так:

Table("Activities");
        Id(x => x.Id).Column("ID").GeneratedBy.Guid();
        Map(x => x.ActivityName).Not.Nullable().Length(50);
        HasMany(x => x.ActivityParameters)
            .KeyColumn("ActivityID")
            .ForeignKeyCascadeOnDelete()
            .Table("ActivityParameters");
0 голосов
/ 27 августа 2009

На самом деле вам нужно определить, какой тип вашего свойства value содержится в IDictionary - NHibernate не знает, как отобразить. Вы должны использовать определенный класс вместо. Затем вы также указываете Mapping для этого класса.

0 голосов
/ 26 августа 2009

Это кажется полезным.

Теоретически это должно выглядеть так:

public class ActivityClassMap : ClassMap<Activity>
{
    ...
    HasMany(x => x.ActivityParameters) 
      .AsMap(x=>x.NameOfParameterOrWhatever)
      .KeyColumnNames.Add("ParameterId"); 
    ...
}

Но это всего лишь небольшое расследование через Google - на практике я не пробовал.

P.s. не забудьте подобрать новейшую версию.

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