Betrachten Sie eine Domäne, in der ein Kunde, ein Unternehmen, ein Mitarbeiter usw. eine ContactInfo-Eigenschaft hat, die ihrerseits eine Reihe von Adressen, Telefonnummern, E-Mail (s) usw. enthält usw ...Entity Framework Nur-Lese-Sammlungen
Hier ist meine abgekürzt Contact:
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);
}
}
Einige Anmerkungen (ich bin nicht 100% sicher, ob diese EF "best practices") sind:
- Sammlung von Adress (es) ist virtuell, um laues Laden zu ermöglichen
- private Setter auf Sammlung verbietet Sammlung Ersatz
- Sammlung ein
ISet
, um sicherzustellen, dass es keine doppelten Adressen pro Kontakt - mit
AddAddress
Methode, die ich versichern kann, dass es immer und höchstens 1-Adresse ist die primäre ist ... .
ich würde (wenn möglich) wie Adressen über ContactInfo.Addresses.Add()
Verfahren zu verhindern, das Hinzufügen und von ContactInfo.AddAddress(Address address)
mit zu zwingen ...
ich denke die eingestellte Belichtungs von Adressen über ReadOnlyCollection
, aber wird dies mit Entity Framework (v5) funktionieren?
Wie würde ich darüber gehen?
Sollte es nicht möglich sein, das IEnumerable an ein ISet zu übertragen und all die Magie zu tun, die danach versteckt werden sollte? –
@Michael Leider ist dies keine Option für mich ... Ich muss in der Lage sein, abzufragen ... – zam6ak
Es funktioniert nicht zuerst in Code. EF erstellt keine Tabelle für die geschützte Sammlung/den geschützten Satz. – 101V