我目前正在研究如何將現有的.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 <>'方法將全部翻譯成產品中的列表。但是,這不是我所需要的。
感謝您的快速回復弗里奧!我接受了答案,因爲現在這個效果很好!然而(請原諒我在這裏缺乏NHibernate的經驗),我是否認爲這將打擊數據庫兩次 - 一次爲Id,一次爲名稱?我認爲加入的原因會更好,因爲只有1次而不是2次? – Needles 2012-01-11 10:04:05
你應該嘗試登錄。國際海事組織它將在一擊中做到這一點 – Firo 2012-01-11 12:04:15
Firo,你是對的!再次感謝您的快速響應! – Needles 2012-01-12 15:25:30