簡體   English   中英

流利的NHibernate加入約束

[英]Fluent NHibernate Join with Constraint

我有一個實體,其屬性分布在兩個表中,我想使用Fluent NHibernate映射到一個類,但對連接表有約束。

我已將此問題的域更改為熟悉的“客戶”域,因此這里的示例可能有些許虛假,但這說明了我的問題。 基本上是這樣 我有一個其中具有一些客戶屬性的客戶表,但是客戶的名和姓被保存在一個單獨的客戶名表中,為鏈接到客戶的兩行,分別被標識為姓和名。

以下是表架構:

創建表Customer(CustomerId int,Birthday datetime)

創建表CustomerName(CustomerId int NOT NULL,CustomerNameTypeId int NOT NULL,名稱nvarchar(25)NOT NULL)

創建表CustomerNameTypes(CustomerNameTypeId NOT NULL,描述nvarchar(25)NOT NULL)

與CustomerNameTypes表包含兩行:1,“名字”,2,“第二名稱”

我需要的是Fluent Mapping,它將上述內容映射到以下內容:

public class Customer
{
    public virtual int CustomerId { get; set; }
    public virtual string FirstName { get; set; }
    public virtual string LastName { get; set; }
    public virtual DateTime Birthday { get; set; }
}

有人可以幫忙嗎?

預先感謝克里斯·布朗

使用nHibernate不能真正回答這個問題,但是我還有其他一些選擇可以幫助您解決它!

  1. 我個人將重新編寫sql如下:

     select c.CustomerId, c.Birthday, fn.Name, ln.Name from Customer c left join CustomerName fn on c.CustomerId = fn.CustomerId left join CustomerNameTypes fnt on fnt.CustomerNameTypeId = fn.CustomerNameTypeId and fnt.[Description] = 'First' left join CustomerName ln on c.CustomerId = ln.CustomerId left join CustomerNameTypes lnt on lnt.CustomerNameTypeId = ln.CustomerNameTypeId and lnt.[Description] = 'Last' 

    這可能會幫助您在仍使用NHibernate時解決。

  2. 另一種選擇是使用視圖。 我個人使用LLBLGenPro,在Linq v2.6中可用之前,這是我偏愛的一種快速,輕松解決硬查詢的方法。

  3. 這將是我想象中的一個艱難的過程,尤其是如果您有一個固執的DBA或它是第三方DB! 反規范化數據庫。 此結構過於規范化,這是您陷入此問題的全部原因。

無論如何,我知道這不是您問題的專門解決方案,但我希望您能從中得到一些好處! :)

我知道這並不能完全回答您的要求,但是...

如果LastName和FirstName都位於CustomerName表的同一行上(但不是),則可以使用<join>映射完成此操作。 Ayende在他的博客中描述了這種HBM映射 這里有一個流暢的示例: 實體跨越多個表 此后,方法名稱已從WithTable()更改為Join()。 如下所示:

public class CustomerMap : ClassMap<Customer>
{
    public CustomerMap()
    {
        Id(x => x.CustomerId);
        Join("CustomerName", m =>
        {
            m.Map(x => x.FirstName);
            m.Map(x => x.LastName);
        });
        // ... other properties ...
    }
}

我還不確定如何解決兩個名稱位於單獨行中的問題。

只是以為我會添加,這是等效的sql:

select c.CustomerId, c.Birthday, fn.Name, ln.Name
from Customer c
  left join CustomerName fn on c.CustomerId = fn.CustomerId and fn.CustomerNameTypeId = (select CustomerNameTypeId from CustomerNameTypes where Description = 'First')
  left join CustomerName ln on c.CustomerId = ln.CustomerId and ln.CustomerNameTypeId = (select CustomerNameTypeId from CustomerNameTypes where Description = 'Last')

干杯!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM