C# 无法映射实体,因为它找不到属性

C# 无法映射实体,因为它找不到属性,c#,nhibernate,C#,Nhibernate,我有一个带有属性关键字和关键字的页面实体 Keyword属性存储一个字符串,如string Keyword=“我的精彩页面,页面” 关键字将在数据库中存储此信息 另一方面,关键字检索此关键字内容并用逗号分隔 所以我的模型里面有 public Page : Entity<int> { public virtual string Keyword {get; set;} public virtual IList<string> Keywords {

我有一个带有属性关键字和关键字的页面实体

Keyword
属性存储一个字符串,如
string Keyword=“我的精彩页面,页面”

关键字将在数据库中存储此信息

另一方面,关键字检索此关键字内容并用逗号分隔

所以我的模型里面有

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>(); }
}
公共页面:实体
{
公共虚拟字符串关键字{get;set;}
公共虚拟IList关键字
{
获取{return关键字.Split(',);}
set{Keyword=string.Join(“,”,value);}
}
公共页面(){Keywords=new List();}
}
所以我试着用代码映射这个实体

public class PageMap : ClassMapping<Page>
{
    public PageMap()
    {
       Property(x => x.Keyword);
       Property(x => x.Keywords, m =>
            { 
                m.Access(Accessor.Field);                    
       });
    }
}
公共类页面映射:类映射
{
公共页面地图()
{
属性(x=>x.Keyword);
属性(x=>x.关键字,m=>
{ 
m、 访问(Accessor.Field);
});
}
}
但我得到的解释是

NHibernate.MappingException:无法编译映射文档: 映射\u by \u代码-->NHibernate.MappingException:尝试时出现问题 通过反射设置属性类型的步骤 NHibernate.PropertyNotFoundException:找不到属性或 类“Model.Page”中的字段“Keywords”

即使我理解这个信息,财产找不到,我也不明白为什么?以及如何克服这个问题


谢谢

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

第二件事是映射。如果
关键字
不是虚拟的(基于
关键字
属性值的运行时解析),我们必须将其映射为集合。任何集合(例如,
IList
)表示一对多关系(在fluent中称为HasMany):


但是,如前所述:如果
关键字
是虚拟的,不要映射它。

如果我理解正确,您将通过字段定义对Keywords属性的访问,但没有为Keywords属性定义字段。NHibernate很可能正在寻找一个名为_keywords的字段。域类中我的所有属性都是虚拟的,NHibernate中的属性都是虚拟的,以触发延迟加载。如果我理解正确,您建议我在本例中引入新对象组件(从ddd的角度)?不,(我认为
virtual
word将无法工作;)。我的意思是虚拟的:不存在于数据库中。此属性通过
关键字的值来解析。它在DB中没有相关列。它是虚拟的/人工的/未持久化的。所以我们不需要绘制地图。无论如何我们只需要在关键字属性中提供值(由NHibernate加载),并在访问关键字时以不同的方式(作为数组)返回其数据。所以,只要跳过它的映射,它就应该可以了。或者使用不同的表在更多的行中持久化更多的值。在这种情况下,HasMany是正确的映射
<bag name="Keywords" table="Keywords">
  <key column="PageId" />
  <element column="Keyword" />
</bag>
HasMany(x => x.Keywords)
    .Table("Keywords")
    .KeyColumn("PageId")
    .Element("Keyword");