2013-09-17 2 views
2

У меня есть объект страницы со свойствами Ключевое слово и ключевые слова.объект сопоставления не может быть выполнен, потому что он не может найти propety

Keyword недвижимость магазин одна строка, как string Keyword = "my awesome page, page";

Ключевое слово будет хранить эту информацию внутри базы данных.

Ключевые слова, с другой стороны, извлекают это ключевое слово и разделяют запятыми.

так что у меня внутри моей модели

public Page : Entity<int> 
{ 
    public virtual string Keyword {get; set;} 
    public virtual IList<string> Keywords 
    { 
     get { return Keyword.Split(','); } 
     set { Keyword = string.Join(",", value); } 
    } 
    public Page() { Keywords = new List<string>(); } 
} 

поэтому я попытался отобразить эту сущность с конформистскому отображения кодом

public class PageMap : ClassMapping<Page> 
{ 
    public PageMap() 
    { 
     Property(x => x.Keyword); 
     Property(x => x.Keywords, m => 
      { 
       m.Access(Accessor.Field);      
     }); 
    } 
} 

, но я получаю expcetion как

NHibernate .MappingException: не удалось скомпилировать документ сопоставления: mapping_by_code ----> NHibernate.MappingException Проблема пытается установить тип собственности путем отражения NHibernate.PropertyNotFoundException: Не удалось найти свойство, ни поля «Ключевые слова» в классе «Model.Page»

Даже я понимаю, сообщение, что собственность не может быть найдена, я не понять почему? и как преодолеть это.

спасибо

+1

Если я правильно понял, вы определяете доступ к свойству Keywords по полю, но у вас нет поля, определенного для свойства Keywords. NHibernate ищет поле с именем _keywords более чем вероятно. – jvanrhyn

ответ

1

Есть две проблемы. Во-первых, свойство Keywords является «виртуальным», что означает, что оно не сохраняется, оно вычисляется/создается во время выполнения. Чтобы заставить его работать, вам не нужно сопоставлять и, следовательно, хранить его. Просто удалите отображение ключевых слов ...

Вторая вещь - отображение. В случае, если Keywords не будет виртуальным (время выполнения разрешено на основе значения свойства Keyword), мы должны сопоставить его как коллекцию. Любой набор (например IList<string>) представляет собой один-ко-многим, (в беглом называется HasMany):

<bag name="Keywords" table="Keywords"> 
    <key column="PageId" /> 
    <element column="Keyword" /> 
</bag> 

Это будет хранить все ключевые слова в своей таблице (например, Ключевых слова), на которые ссылаются PageId колонки и сохранялся в колонке (например, nvrachar) под названием Keyword. Свободный синтаксис будет как:

HasMany(x => x.Keywords) 
    .Table("Keywords") 
    .KeyColumn("PageId") 
    .Element("Keyword"); 

Но, как уже было сказано: если Keywords является virutal, не отобразить его.

+0

Все мои свойства в классе домена являются виртуальными, в свойствах nhibernate виртуальны, чтобы запускать ленивую загрузку. Если я правильно вас понимаю, вы предлагаете ввести новый объект в этом случае (с точки зрения ddd)? – panjo

+0

Нет, * (я думал, что слово 'virtual' не будет работать;) *. Я имею в виду виртуальный с точки зрения: не существующий в БД. Это свойство разрешено из значения свойства Keyword.Он не имеет колонки, связанной с БД. Он является виртуальным/искусственным/не сохраняется. Поэтому нам не нужно отображать его. Так или иначе. Нам будет предоставлено значение в свойстве Keyword (загружено NHibernate) и будет возвращать его данные по-другому (как массив) при доступе к ключевым словам. Итак, просто пропустите его отображение, и это должно быть хорошо. Или используйте другую таблицу для сохранения большего количества значений в большем количестве строк. В этом случае HasMany является правильным отображением –

+0

ОК, спасибо .. – panjo

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