首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于组合字典键的NHibernate映射--代码等价于<复合索引>

用于组合字典键的NHibernate映射--代码等价于<复合索引>
EN

Stack Overflow用户
提问于 2015-02-04 11:43:16
回答 1查看 660关注 0票数 0

可以用多列键映射字典吗?到目前为止,我还没有找到与<composite-index>相当的东西。

举例实体:

代码语言:javascript
复制
public class Warehouse
{
    // ctors

    private IDictionary<StorageCoordinates, StoragePosition> _storagePositions;

    public virtual string Id { get;  protected set; }

    public virtual IEnumerable<StoragePosition> StoragePositions
    {
        get { return _storagePositions.Values; }
    }

    public virtual StoragePosition GetStoragePosition(StorageCoordinates coordinates)
    {
        return _storagePositions[coordinates];
    }
}

public class StoragePosition
{
    // ctors

    public virtual StorageCoordinates Coordinates { get; protected set; }

    public virtual bool IsOccupied { get; set; }
}

public struct StorageCoordinates
{
    public int X { get; set; }
    public int Y { get; set; }
    public int Z { get; set; }
}

使用XML,我可以像这样映射Warehouse._storagePositions

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <class name="Warehouse, Domain" table="Warehouse">
    <id name="Id" type="string" length="50" column="Id" />
    <map name="StoragePositions" access="field.camelcase-underscore" cascade="all-delete-orphan">
      <key column="Warehouse" />
      <composite-index class="StorageCoordinates, Domain">
        <key-property name="X" />
        <key-property name="Y" />
        <key-property name="Z" />
      </composite-index>
      <one-to-many class="StoragePosition, Domain" />
    </map>
  </class>
</hibernate-mapping>

我不确定是否以及如何将其转换为(一致性)代码映射。这就是我取得的成就:

代码语言:javascript
复制
class WarehouseMap : ClassMapping<Warehouse>
{
    public WarehouseMap()
    {
        Table("Warehouse");
        Id(x => x.Id, x => x.Column("Id"));
        Map<StorageCoordinates, StoragePosition>("_storagePositions",
            x =>
            {
                x.Cascade(Cascade.All | Cascade.DeleteOrphans);
                x.Key(k => k.Column(c => c.Name("Warehouse")));
            },
            x =>
            {
                x.Element(k => k.Columns
                (
                    c => c.Name("X"),
                    c => c.Name("Y"),
                    c => c.Name("Z"))
                );
            },
            x => x.OneToMany(m => m.Class(typeof(StoragePosition))));
    }
}

然而,这将产生一个MappingException

"Could not determine type for: StorageCoordinates, Domain, for columns: NHibernate.Mapping.Column(X), NHibernate.Mapping.Column(Y), NHibernate.Mapping.Column(Z)"

任何有关这方面的见解都将不胜感激!不幸的是,关于按代码映射的文档似乎不存在:-( )我试着使用流利的NHibernate,但是在字典映射中,情况似乎更糟。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-04 17:29:17

毕竟,我似乎得到了映射--唯一的问题是StorageCoordinates是一个struct。在使它成为class之后,映射就可以工作了。可能也不会使用XML映射。

更新:显然,显式映射复合字典键甚至都不需要对代码映射。NHibernate似乎以某种方式自己解决了这个问题。

虽然我很喜欢NHibernate,但是这里和那里多一点文档会很好.

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28320536

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档