[英]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不能真正回答這個問題,但是我還有其他一些選擇可以幫助您解決它!
我個人將重新編寫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時解決。
另一種選擇是使用視圖。 我個人使用LLBLGenPro,在Linq v2.6中可用之前,這是我偏愛的一種快速,輕松解決硬查詢的方法。
這將是我想象中的一個艱難的過程,尤其是如果您有一個固執的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.