【问题标题】:Fluent NHibernate join on multiple fields issueFluent NHibernate 加入多个字段问题
【发布时间】: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


    【解决方案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() + "'");
        }
    }
    

    【讨论】:

    • 感谢 Frio 的快速回复!我接受了答案,因为这现在很好用!!但是(请原谅我在这里缺乏 NHibernate 经验),我是否正确地说这将访问数据库两次 - 一次用于 Id,另一次用于 Name?我认为在这里加入会更好的原因是因为只有 1 次命中而不是 2 次?
    • 您应该登录后尝试一下。 IMO 它会一击完成
    • 菲罗,你是对的!!再次感谢您的快速回复!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-17
    • 2010-10-29
    • 1970-01-01
    • 2011-07-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多