Considere un dominio donde un Cliente, Empresa, Empleado, etc. tiene una propiedad ContactInfo que a su vez contiene un conjunto de Dirección (es), Teléfono (s), Correo electrónico (s), etc. , etc ...Colecciones de solo lectura de Entity Framework
Aquí está mi ContactInfo abreviada:
public class ContactInfo : Entity<int>
{
public ContactInfo()
{
Addresses = new HashSet<Address>();
}
public virtual ISet<Address> Addresses { get ; private set; }
public Address PrimaryAddress
{
get { return Addresses.FirstOrDefault(a => a.IsPrimary); }
}
public bool AddAddress(Address address)
{
// insure there is only one primary address in collection
if (address.IsPrimary)
{
if (PrimaryAddress != null)
{
PrimaryAddress.IsPrimary = false;
}
}
else
{
// make sure the only address in collection is primary
if (!Addresses.Any())
{
address.IsPrimary = true;
}
}
return Addresses.Add(address);
}
}
Algunas notas (no estoy 100% seguro de si se trata de EF "mejores prácticas"):
- colección de Dirección (es) es virtual para permitir la carga lenta
- colocador privada en la recolección prohíbe la sustitución de recogida
- colección es una
ISet
para asegurar que no hay direcciones duplicadas por contacto - utilizando
AddAddress
método puedo asegurar que no siempre es y como máximo 1 dirección que es primordial ... .
me gustaría (si es posible) para evitar la adición de direcciones a través de ContactInfo.Addresses.Add()
método y para forzar el uso de ContactInfo.AddAddress(Address address)
...
Pienso exponer el conjunto de direcciones a través del ReadOnlyCollection
, pero ¿funcionará esto con Entity Framework (v5)?
¿Cómo podría hacerlo?
¿No debería ser posible emitir el IEnumerable a un IColoque y hacer toda la magia, que debe ser ocultado después? –
@Michael Lamentablemente, esta no es una opción para mí ... Necesito poder consultar ... – zam6ak
No funciona primero en el código. EF no crea ninguna tabla para la colección/conjunto protegido. – 101V