У меня есть модель домена POCO, которая подключена к платформе сущностей с использованием нового класса 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);
}
}
В приведенном выше примере я установил тип коллекции Photos в IEnumerable, поскольку это сделает его доступным только для чтения. Единственный способ добавить / удалить фотографии - это публичные методы.
Проблема в том, что Entity Framework не может загрузить объекты Photo в коллекцию 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. В настоящее время мне не нравится невозможность контролировать коллекцию!