代码之家  ›  专栏  ›  技术社区  ›  JeffreyABecker

nHibernate将属性映射到行的存在

  •  0
  • JeffreyABecker  · 技术社区  · 15 年前

    我有以下实体和Fluent NHibernate映射:

    public class Advertiser
    {
        public virtual int AdvertiserId { get; set; }
        public virtual string AdvertiserName { get; set; }
        public virtual bool IsPriorityEntity { get; set; }
    }
    
    public class AdvertiserMapping : ClassMap<Advertiser>
    {
        public AdvertiserMapping()
        {
            Id(a => a.AdvertiserId).GeneratedBy.Identity();
            Map(a => a.AdvertiserName);
        }
    }
    

    ISpriorityEntity属性通过PriorityEntity表中的行存储在数据库中。
    查询如下所示:

    Select 
      AdvertiserId, 
      AdvertiserName,  
      CASE WHEN pe.PriorityEntityID IS NOT NULL 
           THEN 1 
           ELSE 0 END as IsPriorityEntity  
    From Advertisers adv  
      Left Join PriorityEntity pe 
        on pe.PriorityEntityID = adv.AdvertiserID 
          and pe.EntityTypeID = 6
    

    我不知道如何绘制这样的地图。

    1 回复  |  直到 15 年前
        1
  •  1
  •   Stefan Steinegger    15 年前

    你可以使它面向对象并映射整个东西:

    public class Advertiser
    {
        public virtual int AdvertiserId { get; set; }
        public virtual string AdvertiserName { get; set; }
        public virtual bool IsPriorityEntity { get { return Priority != null; } }
        public PriorityEntity Priority { get; set; }
    }
    

    编写自定义SQL以加载整个实体或单个属性:

    (抱歉,我不使用fluent,这是XML映射)

    <property 
      name="IsPriorityEntity" 
      formula="Select CASE WHEN count(pe.PriorityEntityID) = 0 THEN 0 ELSE 1 END From PriorityEntity pe WHERE pe.PriorityEntityID = AdvertiserID"/>
    

    不能在此处直接更新属性。您可能还可以编写自定义SQL来更新和插入,但我认为这将变得复杂。