Considera un dominio in cui un cliente, una società, un dipendente, ecc., Hanno una proprietà ContactInfo che a sua volta contiene un insieme di indirizzi, telefoni, e-mail, ecc. , ecc ...Entity Framework read only collections
Ecco la mia ContactInfo abbreviato:
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);
}
}
Alcune note (non sono sicuro al 100% se si tratta di EF "buone pratiche"):
- collezione di Indirizzo (es) è virtuale per consentire il caricamento lazy
- setter privata sulla raccolta vieta la sostituzione collezione
- collezione è un
ISet
per assicurare che non ci sono indirizzi duplicati per contatto - utilizzando
AddAddress
metodo che può assicurare che c'è sempre e al massimo 1 indirizzo che è primario ... .
vorrei (se possibile) per impedire l'aggiunta di indirizzi tramite ContactInfo.Addresses.Add()
metodo e per forzare utilizzando dei ContactInfo.AddAddress(Address address)
...
sto pensando di esporre il di indirizzi tramite ReadOnlyCollection
ma funzionerà con Entity Framework (v5)?
Come dovrei fare questo?
Non dovrebbe essere possibile eseguire il cast dell'IEnumerable su un ISet e fare tutta la magia che dovrebbe essere nascosta in seguito? –
@Michael Purtroppo, questa non è un'opzione per me ... Devo essere in grado di interrogare ... – zam6ak
Non funziona prima nel codice. EF non crea alcuna tabella per la raccolta/il set protetto. – 101V