Как загрузить объекты в частные коллекции с помощью платформы объекта

У меня есть ПОСТЕПЕННО модель предметной области, которая соединена проводом до платформы объекта с помощью нового класса ObjectContext.

public class Product
    {
        private ICollection<Photo> _photos;

        public Product()
        {
            _photos = new Collection<Photo>();         
        }

        public int Id { get; set; }
        public string Name { get; set; }
        public virtual IEnumerable<Photo> Photos
        {
            get
            {
                return _photos;
            }
        }

        public void AddPhoto(Photo photo)
        {
            //Some biz logic
            //...
            _photos.Add(photo);
        }
    }

В вышеупомянутом примере я установил фото тип набора на IEnumerable, поскольку это сделает его только для чтения. Единственный способ добавить/удалить фотографии через открытые методы.

Проблема с этим состоит в том, что Платформа Объекта не может загрузить фото объекты в набор IEnumerable, поскольку это не имеет типа ICollection.

Путем изменения типа на ICollection позволит вызывающим сторонам называть Добавление mentod на самом наборе, который не хорош.

Каковы мои опции?

Править:

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

public class Product
    {
    public Product()
    {
        Photos = new Collection<Photo>();         
    }

    public int Id { get; set; }
    public string Name { get; set; }
    private Collection<Photo> Photos {get; set; }

    public IEnumerable<Photo> GetPhotos()
    {
        return Photos; 
    }

    public void AddPhoto(Photo photo)
    {
        //Some biz logic
        //...
        Photos.Add(photo);
    }

    }

И используйте GetPhotos () для возврата набора. Другая проблема с подходом состоит в том, что я буду освобождать способности к отслеживанию изменений, поскольку я не могу отметить набор как Виртуальный - не возможно отметить свойство как частное виртуальный.

В NHibernate я полагаю, что возможно отобразить прокси-класс на частную коллекцию с помощью конфигурации. Я надеюсь, что это станет функцией EF4. В настоящее время мне не нравится неспособность иметь любой контроль над набором!

7
задан 2 April 2010 в 02:27
поделиться

2 ответа

(Прошу прощения за краткость моего первоначального сообщения - я отвечал со своего телефона)

Вы можете создать свою коллекцию с помощью запроса LINQ по набору сущностей EF. Однако вы сохраняете полученную коллекцию как внутренний член данных для своего бизнес-класса и предоставляете IEnumerable , возвращаемый вызовом AsEnumerable () в сущности, установленной в результате общедоступной Фото.

Вы также можете кэшировать IEnumerable внутренне, чтобы вы не вызывали AsEnumerable () каждый раз, когда вызывающий абонент запрашивает коллекцию. Конечно, это означает, что если пользователю необходимо обновить коллекцию с помощью ваших общедоступных методов, вам, возможно, придется обновить кэшированный IEnumerable . Это может вызвать небольшую проблему, если вызывающий объект также кэшировал указатель на предыдущий IEnumerable .

В качестве альтернативы, если ваш вызывающий объект всегда будет работать с полным набором сущностей, класс EntitySet (от которого будут унаследованы все ваши наборы EF) реализует IEnumerable , поэтому вы может напрямую вернуть набор сущностей вызывающей стороне.

Обратите внимание: если вы хотите, чтобы загрузка коллекции из набора сущностей EF происходила за пределами области вашего бизнес-класса, вы можете создать конструктор в своем классе, который принимает ICollection . Таким образом, когда вы создаете свой объект, коллекция запечатывается в нем и отображается только как IEnumerable .

-1
ответ дан 7 December 2019 в 14:30
поделиться

Почему бы не попробовать следующее и не оставить использование свойств?

private ICollection<Photo> photos{get; set;}
public IEnumerable<Photo> Photos
{
    get {return (IEnumberable<Photo>)photos;}
}

В качестве альтернативы можно использовать паттерн декоратора для инкапсуляции класса в такой класс, в котором коллекция не может быть изменена напрямую.

-1
ответ дан 7 December 2019 в 14:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: