Nhibernate и WCF IList <> Конфликт - PullRequest
1 голос
/ 08 октября 2009

Я буду использовать пример кода, чтобы продемонстрировать свою проблему ...

это сущность

public class Channel : EntityBase
{

    [DataMember]
    public virtual IList<LocalChannel> LocalChannels { get; set; }
}

локальный канал имеет строковое свойство.

эти 2 класса свободно отображаются и прекрасно работают с отношением «многие».

проблема в сервисе wcf.

когда я выбираю канал или все каналы.

список localChannels имеет фиксированный размер. (тип возвращаемого ILIst - типизированный массив)

Я хочу, чтобы я был списком.

Nhibernate не позволит мне написать это:

public virtual List<LocalChannel> LocalChannels { get; set; }

, потому что он не может бросить свои коллекции в Список

и мой прокси написан в коде, а не сгенерирован с помощью svcutil, поэтому я не могу изменить тип коллекции.

какие решения?

Ответы [ 4 ]

5 голосов
/ 09 октября 2009

См. Мой ответ на Вручную измените тип коллекции ClientBase с Array [] на List <>

Должны ли проекции NHibernate и DataContract быть одинаковыми? Я не знаю много о NHibernate, но вы можете сделать что-то вроде этого?

public class Channel : EntityBase{

  //For WCF
  [DataMember(Name="LocalChannel")]
  private List<LocalChannel> LocalChannelsPrivate {
     get {return new List<LocalChannel>(LocalChannels);}
    set {LocalChannels=value;}
  }

  //For NHibernate
  public virtual IList<LocalChannel> LocalChannels {get; set;}
}
3 голосов
/ 28 июня 2010

Существует альтернатива принятому ответу, если вы не хотите использовать несколько свойств. Он использует преимущества того, как WCF десериализует свойства. Используя технику, описанную в этом посте, вы можете кодировать класс следующим образом:

        public class Channel : EntityBase{

            //Initialize backing var to an empty list or null as desired.
            private IList<LocalChannel> _localChannels = new List<LocalChannel>();

            //For WCF & NHibernate:
            [DataMember]
            public virtual IList<LocalChannel> LocalChannels
            {
                get {return _localChannels;}
                set {_localChannels = new List<LocalChannel>(value);}
            }
        }
1 голос
/ 18 сентября 2011

Мне нравится ответ Sixto Saez. Только с одним примечанием: с этим, IList всегда будет иметь тип List. С другой стороны, прокси NHibernate может иметь свою собственную коллекцию, которая наследует IList <...>. Таким образом, мы можем разрешить NHibernate вставлять свою коллекцию, за исключением случая, когда коллекция имеет тип array. Как это:

    private IList<LocalChannel> _localChannels ;
    [DataMember]
    public virtual IList<LocalChannel> LocalChannels {
        get
        {
            return _localChannels ?? (_localChannels = new List<LocalChannel>());
        }
        set
        {
            _localChannels = value.GetType() == typeof(LocalChannel[])
                                ? new List<LocalChannel>(value)
                                : value;
        }
    }
0 голосов
/ 09 октября 2009
private IList<LocalChannel>channels;

public List<LocalChannel>Channels{ get { return this.channels as List<LocalChannel>; } set{ this.channels = value;}

NHibernate сможет использовать IList, но ваш публичный интерфейс может использовать List

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...