NHibernate 按代码映射等效于 <composite-index> 用于复合字典键
NHibernate mapping-by-code equivalent of <composite-index> for composite Dictionary keys
是否可以使用按代码映射来映射具有多列键的字典?我还没有找到 <composite-index>
的等价物。
示例实体:
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
:
<?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>
我不确定是否以及如何将其转换为(遵从)代码映射。这是我取得的进展:
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)"
任何对此的见解将不胜感激!不幸的是,关于按代码映射的文档似乎不存在 :-(。我尝试使用 Fluent NHibernate,但使用字典映射似乎更糟。
似乎我终于得到了正确的映射 - 唯一的问题是 StorageCoordinates
是 struct
。将其设为 class
后,映射工作正常。可能也不会使用 XML 映射。
更新:显然,使用代码映射甚至根本不需要显式映射复合字典键。 NHibernate 似乎以某种方式自行解决了这个问题。
虽然我很喜欢 NHibernate,但如果这里有更多的文档,那就更好了...
是否可以使用按代码映射来映射具有多列键的字典?我还没有找到 <composite-index>
的等价物。
示例实体:
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
:
<?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>
我不确定是否以及如何将其转换为(遵从)代码映射。这是我取得的进展:
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)"
任何对此的见解将不胜感激!不幸的是,关于按代码映射的文档似乎不存在 :-(。我尝试使用 Fluent NHibernate,但使用字典映射似乎更糟。
似乎我终于得到了正确的映射 - 唯一的问题是 StorageCoordinates
是 struct
。将其设为 class
后,映射工作正常。可能也不会使用 XML 映射。
更新:显然,使用代码映射甚至根本不需要显式映射复合字典键。 NHibernate 似乎以某种方式自行解决了这个问题。
虽然我很喜欢 NHibernate,但如果这里有更多的文档,那就更好了...