Унаследованная проблема с отображением текучих нибенатов - PullRequest
1 голос
/ 02 июня 2010

У меня сегодня интересная проблема !! В основном у меня есть два класса.

public class A : B
{
   public virtual new ISet<DifferentItem> Items {get;set;}
}

public class B
{
  public virtual int Id {get;set;}
  public virtual ISet<Item> Items {get;set;}
}

Подкласс A скрывает свойство базового класса B Items и заменяет его новым свойством с тем же именем и другим типом.

Отображения для этих классов

public class AMapping : SubclassMap<A>
{
  public AMapping()
  {
    HasMany(x=>x.Items)
      .LazyLoad()
      .AsSet();
  }
}

public class BMapping : ClassMap<B>
{
   public BMapping()
   {
     Id(x=>x.Id);

      HasMany(x=>x.Items)
        .LazyLoad()
        .AsSet();  
   }
}

Однако, когда я запускаю свой модульный тест для проверки соответствия, я получаю следующее исключение:

Проверяет отображение A: NHibernate.PropertyAccessException: Invalid Cast (проверьте соответствие на предмет несоответствий типов свойств); сеттер А ----> System.InvalidCastException: не удалось привести объект типа 'NHibernate.Collection.Generic.PersistentGenericSet 1[Item]' to type 'Iesi.Collections.Generic.ISet 1 [DifferentItem]'.

У кого-нибудь есть идеи?

Очевидно, это связано с типом коллекции в подклассе. Но я пролистал доступные опции в классе отображения, и ничто не выделялось как решение здесь.

1 Ответ

1 голос
/ 02 июня 2010

Обобщения в c # не поддерживают ковариацию, поэтому по существу вы не можете иметь ISet<Item> и ISet<DifferentItem>. Поскольку это ограничение языка, вам нужно переосмыслить свой дизайн. Или подождите пока # 6.

...