0

我目前正在研究如何將現有的.NET 4.0 MVC 3 Web應用程序的數據訪問層移植到實體框架。有很多原因,但主要原因是由於成千上萬的存儲過程,添加一個字段到表中會導致30 - 50個sproc編輯!流利NHibernate加入多個字段問題

我們正在使用MS SQL Server 2008 R2,理想情況下,我們希望使用NHibernate和Fluent進行映射。

我已經簡化具有成一個簡單的例子IM的問題:

想象以下2個表:

'產品' 表

ID (INT) 
DefaultName (NVARCHAR(128)) 

'產品名稱' 表

ProductID (INT) 
Name (NVARCHAR(128)) 
Culture (VARCHAR(10)) 

產品表將包含產品列表,其中每個產品都將具有默認的英文名稱。產品名稱表將包含產品的ID和許多翻譯。

目前,使用存儲過程,我們有以下幾點:

SELECT Products.ID, 
     ISNULL(ProductNames.Name, Products.DefaultName) AS Name 
FROM Products 
LEFT JOIN ProductNames ON ProductNames.ProductID = Products.ID AND ProductNames.Culture = @Culture; 

注:@Culture傳遞到程序

這始終確保了單品無論是本地化名稱或默認(英文)名稱被退回。

我的問題是:這可能做在流利NHibernate的映射級別?我一直在尋找'如何加入2列'的日子,但無法找到可行的解決方案。如果在這樣一個成熟的框架中這是不可能的,這似乎很奇怪?

由於我一直在用試驗的例子:

public class ProductMap : ClassMap<Product> { 
    public ProductMap() { 
    Id(p => p.Id); 

    Join("ProductNames", pn => { 
     pn.Optional() 
     .KeyColumn("ProductID") 
     .Map(p => p.Name); 
    }); 
    } 
} 

然而,這會導致以下異常:

More than one row with the given identifier was found: 109, for class: Product 

這是因爲產品109有5名翻譯,因此所有5不能映射到單個字符串。

我設法使用'HasMany <>'方法將全部翻譯成產品中的列表。但是,這不是我所需要的。

回答

1

如果名稱是隻讀的,然後

public class ProductMap : ClassMap<Product> { 
    public ProductMap() { 
     Id(p => p.Id); 

     Map(p => p.Name).Formula("Select ISNULL(pn.Name, DefaultName) FROM ProductNames pn WHERE pn.ProductID = ID AND pn.Culture = '" + GetCUltureFromSomewhere() + "'"); 
    } 
} 
+0

感謝您的快速回復弗里奧!我接受了答案,因爲現在這個效果很好!然而(請原諒我在這裏缺乏NHibernate的經驗),我是否認爲這將打擊數據庫兩次 - 一次爲Id,一次爲名稱?我認爲加入的原因會更好,因爲只有1次而不是2次? – Needles 2012-01-11 10:04:05

+0

你應該嘗試登錄。國際海事組織它將在一擊中做到這一點 – Firo 2012-01-11 12:04:15

+1

Firo,你是對的!再次感謝您的快速響應! – Needles 2012-01-12 15:25:30