【发布时间】:2012-01-11 04:15:00
【问题描述】:
我目前正在研究如何将现有 .NET 4.0 MVC 3 Web 应用程序的数据访问层移植到实体框架。原因有很多,但最主要的原因是由于数千个存储过程,向表中添加 1 个字段会导致 30 - 50 次存储过程编辑!
我们正在使用 MS SQL Server 2008 R2,理想情况下,我们希望使用 NHibernate 和 Fluent 进行映射。
我已将我遇到的问题简化为一个简单的示例:
想象以下 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 被传递到过程中
这始终确保返回具有本地化名称或默认(英文)名称的单个产品。
我的问题是:这是否可以在 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”方法将所有翻译映射到产品中的列表。但是,这不是我需要的。
【问题讨论】:
标签: asp.net-mvc sql-server-2008 fluent-nhibernate left-join fluent-nhibernate-mapping