代码之家  ›  专栏  ›  技术社区  ›  Stu

具有特定类型的字符串外键的NHibernate映射

  •  0
  • Stu  · 技术社区  · 7 年前

    我正在尝试映射NHibernate中的字符串外键。这是可行的,但字段是varchar(10)。这会导致性能问题,脚本超时,因为NH使用的是nvarchar(4000)。当我们将SSMS中的变量类型更改为varchar(10)时,查询耗时不到一秒。

    我在NHibernate中有以下设置:

    public class Product
    {
      ProductCode:string;
    }
    public class ProductMap : ClassMap<Product>
    {
      public ProductMap()
      {
        Id(p=>p.ProductCode);
      }
    }
    
    public class Holding
    {
      public long HoldingID {get;set;
      public Product Prod {get;set;}
      public decimal SomeValue {get;set;}
    }
    public class HoldingMap
    {
      public HoldingMap()
      {
        Id(h=>h.HoldingID);
        References(h=>h.Product, "ProductCode");
        Map(h=>h.SomeValue);
      }
    }
    

    我试着改变 Id(p=>p.ProductCode); 以便更好地键入:

    Id(c => c.Code, "portfolio_code").CustomSqlType("varchar(10)");

    但这似乎没有改变任何事情。有人知道如何让NH使用正确类型的参数生成查询吗?

    谢谢

    1 回复  |  直到 7 年前
        1
  •  0
  •   Stu    7 年前

    @David Osbourne是正确的,这确实回答了我的潜在问题: Always encrypted mapping in NHibernate 但我会在这里总结。

    NHibernate将始终使用参数的最大字段大小来允许通配符,因此强制字段长度有点冒险。如果您确实需要,您可以在链接答案的驱动程序中看到答案。

    我的问题实际上是由NH在VARCHAR字段上使用NVARCHAR引起的。通过将列更改为being和AnsiString,我将所用的时间从40秒减少到了亚秒。