2

我有具有关键字和关键字属性的页面实体。

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

但我得到了像

NHibernate.MappingException:无法编译映射文档:mapping_by_code ----> NHibernate.MappingException:尝试通过反射设置属性类型时出现问题 NHibernate.PropertyNotFoundException:在“Model.Page”类中找不到属性或字段“关键字”

即使我明白找不到财产的消息,我也不明白为什么?以及如何克服这一点。

谢谢

4

1 回答 1

1

有两个问题。首先,关键字属性是“虚拟的”,这意味着它不是持久的,它是在运行时计算/构建的。要使其正常工作,您不需要映射并因此存储它。只需删除关键字映射...

第二件事是映射。如果这Keywords不是虚拟的(运行时根据Keyword属性值解析),我们必须将其映射为集合。任何集合(例如IList<string>)表示一对多的关系,(流利地称为 HasMany):

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

这会将所有关键字存储在其自己的表中(例如,关键字),由列引用并保存在名为PageId的列(例如nvracharKeyword中。Fluent 语法如下:

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

但是,正如已经说过的:如果Keywords是虚拟的,请不要映射它。

于 2013-09-18T02:57:53.230 回答