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