2015-02-04 1 views
0

Возможно ли сопоставление словаря с помощью многоколоночного ключа с использованием сопоставления по коду? Я еще не нашел эквивалент <composite-index>.NHibernate, эквивалентный сопоставлению <составной индекс> для составных ключей словаря

Пример структуры:

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, но это выглядит еще хуже при сопоставлении словаря.

ответ

0

Похоже, что я получил правильное отображение в конце концов - единственная проблема в том, что StorageCoordinates был struct после делает его class, отображение работы Вероятно, не работал бы с отображением XML либо

UPDATE: по-видимому, явно отображение составного ключа словарь не является... даже необходимо вообще с картографическим кодом. NHibernate, похоже, каким-то образом выясняет это сам.

Насколько я люблю NHibernate, немного больше документации здесь и там было бы хорошо ...

Смежные вопросы