我的页面实体具有属性关键字和关键字。
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'中的字段'关键字'
即使我理解无法找到属性的消息我也不明白为什么?以及如何克服这一点。
感谢
答案 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
是虚拟的,请不要映射它。