NHibernate - 向实体添加评论属性(使用加入存储)

Posted

技术标签:

【中文标题】NHibernate - 向实体添加评论属性(使用加入存储)【英文标题】:NHibernate - Add Comment Property to Entities (Store with Join) 【发布时间】:2013-04-01 14:13:39 【问题描述】:

我有一个系统,我需要能够将评论字段添加到客户和位置模型,但我无法触及现有表的架构。但是,我可以添加一个评论表。我已经简化了这个例子。我们希望能够将此评论添加到更多模型中,它们都使用 Guid 作为 Id。

此现有系统是具有自己的数据访问层的第 3 方系统。

我们才刚刚开始接触 NHibernate。据我所知,它看起来像一个 Join 地图。

例子:

public class Customer 

    public Guid Id  get; private set; 
    public string FirstName  get; private set; 
    public string LastName  get; private set; 
    public string Comment  get; set; 
    

public class Location

    public Guid Id  get; private set; 
    public string Name  get; private set; 
    public string Address  get; private set; 
    public string Comment  get; set; 

注意:我们确定我们希望 Comment 是一对一的关系,而不是一对多的关系。

如何配置一个单独的表,只捕获 Id 和 Comment?我正在寻找要使用的正确术语。我正在寻找带有 XML 的示例(如果可能的话,还有 Fluent 配置)。我想将所有对象的评论保留在一张表中。谢谢。

【问题讨论】:

【参考方案1】:

如果您可以添加注释表(以及现有表中的相应键列),则流畅的映射看起来像

public class CustomerMap : ClassMap<Customer>
  public CustomerMap()
        //...other columns mappings

        References(c=>c.Comment).Column("CommentId");
  

并为其他实体重复此操作。您也可以在那里设置所需的 fetch-mode(join) 和其他操作。我已经写了References 那里(多对一),但如果你需要一对一的映射,那差别不大

【讨论】:

一对一映射是什么样的? References更改为HasOne【参考方案2】:

如果您无法更改数据库架构,那么您的选择将非常有限。 也许,你可以使用映射来做到这一点。 看这里:

http://ayende.com/blog/3961/nhibernate-mapping-join

尝试在所有实体的映射中使用相同的列名。

【讨论】:

你知道有没有办法通过配置告诉系统主实体不可变但“连接”是可变的? @brun:什么意思?如果 na 实体不可变,那么它的任何部分都无法改变。 有一个我不想改变 Comment 属性的客户部分很好。我是否只是在上面的 C# 中显示的那些属性上使用私有“集”来强制执行? @brun:如果您不希望某个属性不被更新,您可以在映射中将其设置为 update="false"。我不确定我是否得到了你需要的东西。 :)

以上是关于NHibernate - 向实体添加评论属性(使用加入存储)的主要内容,如果未能解决你的问题,请参考以下文章

通过 NHibernate 代码映射将 GUID 属性作为外键映射到其他实体

如何使用 NHibernate 联合子类映射抽象属性?

NHibernate - 错误脱水属性值 - 更新实体

Fluent NHibernate:如何在关系表上映射具有附加属性的多对多关系?

使用 Sqlite3 向实体添加派生属性

NHibernate QueryOver实体具有IList属性子属性