J'ai un modèle de domaine POCO qui est relié au cadre d'entités à l'aide de la nouvelle classe 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);
}
}
Dans l'exemple ci-dessus, j'ai défini le type de collection Photos comme étant IEnumerable, ce qui la rendra accessible en lecture seule. La seule façon d'ajouter/supprimer des photos est d'utiliser les méthodes publiques.
Le problème est que l'Entity Framework ne peut pas charger les entités photo dans la collection IEnumerable car elle n'est pas de type ICollection.
En changeant le type en ICollection, les appelants pourront appeler la méthode Add sur la collection elle-même, ce qui n'est pas une bonne chose.
Quelles sont mes options ?
Editer :
Je pourrais remanier le code de manière à ce qu'il n'expose pas une propriété publique pour Photos :
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);
}
}
Et utilisez la fonction GetPhotos() pour renvoyer la collection. L'autre problème de cette approche est que je perdrai les capacités de suivi des modifications car je ne peux pas marquer la collection comme étant virtuelle - il n'est pas possible de marquer une propriété comme étant privée et virtuelle.
Dans NHibernate, je crois qu'il est possible de faire correspondre la classe proxy à la classe privé par le biais de la configuration. J'espère que cela deviendra une fonctionnalité de EF4. Pour l'instant, je n'aime pas l'impossibilité d'avoir un contrôle sur la collection !