0

我目前正在研究如何将现有 .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<>”方法将所有翻译映射到产品中的列表中。然而,这不是我需要的。

4

1 回答 1

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() + "'");
    }
}
于 2012-01-10T20:15:00.540 回答