我目前正在研究如何将现有 .NET 4.0 MVC 3 Web 应用程序的数据访问层移植到实体框架。有很多原因,但主要原因是由于成千上万的存储过程,仅向表中添加 1 个字段会导致 30 - 50 sproc 编辑!
我们正在使用 MS SQL Server 2008 R2,理想情况下,我们希望使用 NHibernate 和 Fluent 进行映射。
我已将我遇到的问题简化为一个简单的示例:
想象一下以下 2 个表:
“产品”表
ID (INT)
DefaultName (NVARCHAR(128))
“产品名称”表
ProductID (INT)
Name (NVARCHAR(128))
Culture (VARCHAR(10))
Products 表将包含一个产品列表,每个产品都有一个默认的英文名称。产品名称表将包含产品的 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 被传递到过程中
这始终确保返回具有本地化名称或默认(英文)名称的单个产品。
我的问题是:这是否可以在 Fluent 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<>”方法将所有翻译映射到产品中的列表中。然而,这不是我需要的。