代码之家  ›  专栏  ›  技术社区  ›  Dan TheCodeJunkie

使用nHibernate将两个不同的数据模型映射到一个实体模型

  •  2
  • Dan TheCodeJunkie  · 技术社区  · 16 年前

    我有两个不同的数据模型映射到同一个汽车实体。我需要创建一个名为parkedcar的第二个实体,它与car相同(因此从中继承),以便阻止nhibernate抱怨同一个实体存在两个映射。

    public class Car
    {
         protected Car()
         {
           IsParked = false;
         }
    
        public virtual int Id { get; set; }  
        public  bool IsParked { get; internal set; }
    }
    
    public class ParkedCar : Car
    {
            public ParkedCar()
            {
                IsParked = true;
            }
           //no additional properties to car, merely exists to support mapping and signify the                           car is parked
    }
    

    唯一的问题是,当我使用类似这样的标准API从数据库中检索汽车时:

    SessionProvider.OpenSession.Session.CreateCriteria<Car>()
                        .Add(Restrictions.Eq("Id", 123))
                        .List<Car>();
    

    该查询返回来自ParkedCar数据模型的汽车实体。就好像NHibernate拖欠了专门的实体。而这些映射则是在正确的位置进行挑衅:

    <class name="Car" xmlns="urn:nhibernate-mapping-2.2" table="tblCar">
    
    <class name="ParkedCar" xmlns="urn:nhibernate-mapping-2.2" table="tblParkedCar" >
    

    我该怎么阻止?

    2 回复  |  直到 16 年前
        1
  •  3
  •   dotjoe    16 年前

    我认为您需要在 class mapping

    <class "Car" polymorphism="explicit" ...
    
        2
  •  0
  •   Jamie Ide    16 年前

    因为parkedcar扩展了car,所以对car的查询将同时返回car和parkedcar对象。可以使用hql限制类型,使用 special class property ,即 from Car c where c.class = Car . 我认为你不能用标准API来实现这一点。

    或者,如果列表的大小合理,可以在检索后对其进行筛选。