映射实体无法完成,因为它找不到属性

时间:2013-09-17 11:35:12

标签: c# nhibernate

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

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 ----&gt; NHibernate.MappingException:尝试问题   通过反射设置属性类型   NHibernate.PropertyNotFoundException:找不到属性也没有   类'Model.Page'中的字段'关键字'

即使我理解无法找到属性的消息我也不明白为什么?以及如何克服这一点。

感谢

1 个答案:

答案 0 :(得分:1)

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

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

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

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

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

但是,如前所述:如果Keywords是虚拟的,请不要映射它。