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