【问题标题】:mapping entity cannot be done cause it cannot find propety无法完成映射实体,因为它找不到属性
【发布时间】:2013-09-18 10:57:53
【问题描述】:

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

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”类中的“关键字”字段

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

谢谢

【问题讨论】:

  • 如果我理解正确,您正在将关键字属性的访问定义为按字段,但您没有为关键字属性定义字段。 NHibernate 很可能正在寻找一个名为 _keywords 的字段。

标签: c# nhibernate


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • 我在域类中的所有属性都是虚拟的,在 nhibernate 中的属性都是虚拟的以触发延迟加载。如果我理解正确,您建议我在这个案例组件中引入新对象(从 ddd 角度)?
  • 不,(我认为virtual 这个词不起作用;)。我的意思是从角度来看是虚拟的:在数据库中不存在。此属性从Keyword 属性的值解析。它在数据库中没有相关的列。它是虚拟的/人工的/不持久的。所以我们不需要映射它。无论如何。我们将在 Keyword 属性(由 NHibernate 加载)中提供值,并在访问关键字时以不同的方式(作为数组)返回其数据。所以,跳过它的映射,应该没问题。或者使用不同的表在更多行中保留更多值。在这种情况下,HasMany 是正确的映射
猜你喜欢
  • 2015-09-16
  • 2019-01-10
  • 1970-01-01
  • 1970-01-01
  • 2019-07-04
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 2019-08-27
相关资源
最近更新 更多