2009-08-26 4 views
9

Я новичок в NHibernate и Fluent NHibernate.Fluent NHibernate mapping

Предполагая, что я ситуация, как в следующем

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;} 
} 

как я могу написать classmap? В частности, как я могу написать сопоставление для параметров активности?

ответ

16

коллега указал на е this site.

на основе этой дискуссии, я приходят к

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

Это работает !!! Спасибо всем вам за указание направления! – DaeMoohn

+3

Отличная работа с вашим собственным решением. Проголосовать за это ... – Skittles

0

This похоже полезный.

Теоретически это должно выглядеть следующим образом:

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

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

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

+0

Большое спасибо, я попробую. Еще раз спасибо! – DaeMoohn

0

Основываясь на вашем намеке, я пришел к:

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

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

-1

Прошу простить мое невежество.

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

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

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

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

+0

Это альтернативный подход к написанию файлов hbm.xml. – DaeMoohn

+0

Спасибо за ваш ответ! Я буду интересоваться, когда снова приду к работе с NHibernate. –

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