2009-11-30 57 views
4

我有一個實體,其性質分佈在兩張表上,我想用Fluent NHibernate映射到一個類,但是在連接表上有一個約束。流暢的NHibernate加入約束

我已將此問題的域問題更改爲客戶域,因此我這裏的示例可能會有點麻煩,但它說明了我的問題。這是基本的;我有一個客戶表,其中包含一些客戶屬性,但客戶的名字和姓氏被保存在一個單獨的CustomerName表中,作爲鏈接到客戶的兩行,並標識爲姓和名。

下面是表模式:

CREATE TABLE客戶( 客戶編號INT, 生日日期時間 )

CREATE TABLE客戶名稱( 客戶編號詮釋NOT NULL, CustomerNameTypeId INT NOT NULL, 名稱nvarchar(25)NOT NULL )

CREATE TABLE CustomerNameTypes( CustomerNa meTypeId NOT NULL, 描述爲nvarchar(25)NOT NULL )

用含有兩排CustomerNameTypes表: 1, 「姓」 2 「SecondName」

我需要的是一個流利映射那將上圖映射到以下內容:

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; } 
} 

任何人都可以幫忙嗎?

提前 克里斯·布朗

+0

忘記FNH一秒鐘,你有任何想法如何使用正常的NHibernate hbm xml解決這個問題嗎? – 2009-12-02 11:06:26

回答

0

只是想我要補充很多的感謝,這是等價的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') 

喝彩!

1

不能用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,並且在2.6版本中使用Linq之前,這是我快速而輕鬆地解決硬查詢的首選方法。

  3. 這將是我想象中的一個難題,特別是如果你有一個固執的DBA或它是第三方DB!取消規範化數據庫。這種結構過於規範化,是你陷入這個問題的全部原因。

無論如何,我知道這不是你的問題的具體答案,但我希望你會得到一些使用它!:)

+0

愚蠢的stackoverflow不會代碼突出顯示sql!抱歉。 – 2009-12-02 11:40:15

+0

+1爲「使用視圖」建議 – 2009-12-06 05:35:27

1

我知道這並不完全回答你問的是什麼,但是......

如果這兩個姓氏和名字都在同一行的客戶名稱表的(但他們不是),你可以通過<加入>映射來完成此操作。 Ayende describes this HBM mapping在他的博客上。這裏有一個流暢的nhibernate例子:Entity spanning multiple tables。方法名稱從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 ... 
    } 
} 

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