代码之家  ›  专栏  ›  技术社区  ›  Brett Veenstra

NHibernate-错误的思维?基于连接的子类模型

  •  0
  • Brett Veenstra  · 技术社区  · 17 年前

    我有一个简单的模型类(Part),它从单个表(t_Part)中提取信息。

    我想要这个模型的一个子类(ProducedPart),它仍然使用NHibernate的缓存机制,但只能是在名为“t_PartProduction”的表中具有外键关系的(Part)的实例。我不知道 需要 为第二张表创建一个模型。

    我只需要ProducedPart的只读版本

    这是使用NH的错误方式吗?

    编辑

    因此,SQL看起来像

    SELECT p.* 
    FROM t_Part p 
    INNER JOIN t_PartProduction pp ON pp.PartID = p.PartID 
    WHERE pp.ProductionYear = '2009'
    
    3 回复  |  直到 17 年前
        1
  •  1
  •   Community Mohan Dere    9 年前

    我相信您正在寻找的是一个连接的子类。在FNH中,它将类似于:

    public class PartMap : ClassMap<Part>
    {
        public PartMap()
        {
            Id(x => x.Id)
    
            JoinedSubClass<ProducedPart>("PartID", sub => { 
                sub.Map(x => x.Name); 
                sub.Map(x => x.ProductionYear); 
            });
        }
    }
    

    从上下文中引入一些上下文 FNH groups thread my answer 关于NHibernate中的只读会话,请参阅前面的问题,以了解我对该问题的更多想法。

        2
  •  1
  •   Brett Veenstra    17 年前

    这里的关键是使用 where mutable class NHibernate映射的定义。

    使用Fluent NHibernate,如下所示:

        public Part()
        {
            WithTable("t_Part");
    
            Id(i => i.Id).ColumnName("PartID");
            Map(m => m.Name).ColumnName("Part");
    
            SetAttribute("where", "PartID IN ( SELECT pp.PartID FROM t_PartProduction pp WHERE pp.ProductionYear = '2009' ) ");
    
            ReadOnly();
        }
    
        3
  •  1
  •   Frédéric    9 年前

    不,这是完全可能的。在NHibernate文档中查找继承的“每个子类的表”模型。它实际上将实现这一点作为一个左连接,因此当您加载一个零件时,它将根据是否存在另一行创建您的零件或ProducedPart类的实例。您可以在上找到文档 nhibernate.info

    不过,我不确定您是否可以将ProducedPart设置为只读。

    我从这里假设:

    WHERE pp.ProductionYear = '2009'
    

    推荐文章