2

我有以下我的域(和 FNH 映射)的摘录

public class Product
{
  public virtual int Id { get; set; }
  public virtual string Name { get; set; }        
  public virtual IDictionary<LimSet, string> Attributes { get; set; }
  /*equality logic there*/
}

public class LimSet
{
  virtual public int Id { get; set; }
  public virtual string Name { get; set; }
  /*equality logic there*/
}                

internal class LimSetMap : ClassMap<LimSet>
{
  public LimSetMap()
  {
      Table("LIMSET");
      Id(x => x.Id).GeneratedBy.Assigned();
      Map(x => x.Name);
  }
}
internal class ProductMap : ClassMap<Product>
{
  public ProductMap()
  {
      Table("PRODUCT");
      Id(x => x.Id).GeneratedBy.Assigned();
      Map(x => x.Name);            
      HasMany(x => x.Attributes)
          .AsEntityMap("LIMSET_ID")
          .Table("PRODUCT_ATTR")
          .KeyColumn("PRODUCT_ID")
          .Cascade.AllDeleteOrphan()
          .Element("VALUE");
  }   
}

问题在于使用另一个实体作为键的组件的映射(字典)(到目前为止是简单的字符串值)。一切似乎都很好,例如我可以生成数据库模式,也可以操作字典并使用级联保存它。当我使用查询属性字典时

var prodWithAttrs = session.Query<Product>()
  .Where(p => p.Id == 1)
  .SelectMany(p => p.Attributes,
     (p, a) => new
               {
                 Product = p.Name,
                 Attribute = a.Key.Name,
                 Value = a.Value
               });

我遇到了一个例外

cannot dereference scalar collection element: Key [.SelectMany[Domain.Product,System.Collections.Generic.KeyValuePair`2[...

我已经尝试了几个选项来改写查询但没有成功。您知道当前(3.3.2)NH Linq 提供程序是否可以实现这样的事情?

非常感谢

4

1 回答 1

0

不确定这是否对您有帮助...

我刚刚从 NH 2.2 升级到 3.3.2,并且之前在 NH 2.2 中使用 NH.Linq 提供程序运行良好的某些 SelectMany 查询出现了相同的错误。

我的 NH 2.2(工作)查询的形式为:

Session.Query<T>().SelectMany(o => o.DictionaryProperty.Values)

我会在 NH 3.3.2 中收到以下错误:

cannot dereference scalar collection element: Values

我能够通过将查询更改为:

Session.Query<T>().SelectMany(o => o.DictionaryProperty).ToList().Select(kvp => kvp.Value)

这有效地将字典值访问从 Linq-to-NHibernate 移到 Linq-to-Objects 中。还不确定这里发生了什么...

于 2012-12-20T18:51:45.750 回答