我目前正在研究如何将现有的.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