entity framework - then - ¿Por qué el marco de la entidad necesita una ICollection para la carga diferida?
include then include entity framework (3)
Creo que encontré la solución ... Consulte aquí para obtener más información: http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/47296641-0426-49c2-b048-bf890c6d6af2/
Básicamente, desea proteger el tipo de ICollection y utilizarlo como la colección de respaldo para el público.
public class Product
{
// This is a mapped property
protected virtual ICollection<Photo> _photos { get; set; }
// This is an un-mapped property that just wraps _photos
public IEnumerable<Photo> Photos
{
get { return _photos; }
}
public void AddPhoto(){...}
public void RemovePhoto(){...}
}
Para que la carga perezosa funcione, el tipo debe implementar ICollection y el acceso debe ser público o estar protegido.
Quiero escribir una clase de dominio enriquecido, como
public class Product
{
public IEnumerable<Photo> Photos {get; private set;}
public void AddPhoto(){...}
public void RemovePhoto(){...}
}
Pero el marco de la entidad (primer enfoque del código V4) requiere un tipo de colección de IC para la carga diferida. El código anterior ya no funciona según lo diseñado, ya que los clientes pueden omitir el método AddPhoto / RemovePhoto y llamar directamente al método add en ICollection. Esto no está bien.
public class Product
{
public ICollection<Photo> Photos {get; private set;} //Bad
public void AddPhoto(){...}
public void RemovePhoto(){...}
}
Se está poniendo realmente frustrante al intentar implementar DDD con EF4. ¿Por qué eligieron ICollection para la carga diferida?
¿Cómo puedo superar esto? ¿NHibernate me ofrece una mejor experiencia en DDD?
No puede insertar en un IEnumerable. Esto se aplica a la FE tanto como a sus clientes. Sin embargo, no tiene que usar ICollection; puede usar IList u otros tipos escribibles. Mi consejo para obtener lo mejor de ambos mundos es exponer los DTO en lugar de entidades a sus clientes.
Puede superar esto utilizando ReadOnlyCollection (Of T)
public class Product
{
private IList<Photo> _photos;
public IList<Photo> Photos {
get
{
return _photos.AsReadOnly();
}
private set { _photos = value; }
}
public void AddPhoto(){...}
public void RemovePhoto(){...}
}
EDITAR: ICollection<T>
=> IList<T>
Espero que sea eso lo que estabas buscando.