Сопоставление списка объектов значений в nhibernate

У меня есть модель дома, в которой есть список дверей (дверь представляет объект-значение)

public class House : Entity<Guid>
{
   public int Id { get; set; }
   public List<Door> Doors { get; set; }
   ...
   public House(){
      Doors = new List<Door>();
   }
}

Я использую сопоставление nhibernate с помощью кода, поэтому я попытался сопоставить House

HouseMap.cs

public class HouseMap: ClassMapping<House>
{
   public HouseMap()
   {
      ...
      Component(c => c.Doors, DoorMap.Mapping());
   }
}

DoorMap.cs

public class DoorMap
{
    public static Action<IComponentMapper<Door>> Mapping()
    {
        return c =>
        {
            c.Property(p => p.Number);
            c.Property(p => p.Color);             
        };
    }
}

Я получаю сообщение об ошибке на HouseMap.cs

Component(c => c.Doors, DoorMap.Mapping());

НЕ МОЖЕТ ПРЕОБРАЗОВАТЬ ЛЯМБДА-ВЫРАЖЕНИЕ В ТИП 'STRING', ПОСКОЛЬКУ ЭТО НЕ ТИП ДЕЛЕГАТА

Что я здесь делаю неправильно? Другое сопоставление объектов, не являющихся значениями списка, в порядке.


person user1765862    schedule 11.01.2015    source источник


Ответы (1)


Вы обязательно должны использовать интерфейс для своего объекта С#:

public class House : Entity<Guid>
{
    ...
    //public List<Door> Doors { get; set; }
    public virtual IList<Door> Doors { get; set; }

А отображение набора ссылок описано здесь:

Mapping-by-Code — Set and Bag от Адама Бара

исходя из этого, сопоставление коллекции Doors должно выглядеть следующим образом: (я предпочитаю .Bag() с IList, а не .Set() с более конкретным ISet)

Bag(x => x.Doors, c =>
{
   ...

и это другие доступные настройки (выдержка из ссылки выше):

c.Fetch(CollectionFetchMode.Join); // or CollectionFetchMode.Select
                                   // , CollectionFetchMode.Subselect
c.BatchSize(100);
c.Lazy(CollectionLazy.Lazy); // or CollectionLazy.NoLazy, CollectionLazy.Extra

c.Table("tableName");
c.Schema("schemaName");
c.Catalog("catalogName");

c.Cascade(Cascade.All);
c.Inverse(true);

c.Where("SQL command");
c.Filter("filterName", f => f.Condition("condition"));
c.OrderBy(x => x.Name); // or SQL expression

c.Access(Accessor.Field);
c.Sort<CustomComparer>();
c.Type<CustomType>();
c.Persister<CustomPersister>();
c.OptimisticLock(true);
c.Mutable(true);
...
person Radim Köhler    schedule 11.01.2015