Entity Framework nur-lese-Sammlungen
Überlegen, eine domain, wo ein Kunde, Unternehmen, Mitarbeiter, etc, etc, haben eine ContactInfo Eigenschaft, die wiederum enthält eine Reihe von Adresse(N), Telefonnummer(N), E-Mail(s), etc, etc...
Hier ist mein abgekürzt ContactInfo:
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 mir nicht 100% sicher, ob diese EF "best practices"):
- Sammlung-Adresse(N) virtuell ist, zu ermöglichen, lazy loading
- private setter collection verbietet collection Ersatz
- - Kollektion ist ein
ISet
zu versichern, dass es keine doppelten Adressen pro Kontakt - mit
AddAddress
Methode kann ich versichern, dass es immer und bei den meisten 1-Adresse, die primäre....
Möchte ich (wenn möglich) um zu verhindern, dass das hinzufügen von Adressen per ContactInfo.Addresses.Add()
Methode und zu zwingen, mit der ContactInfo.AddAddress(Address address)
...
Ich bin am überlegen auszusetzen, die Adressen, die über ReadOnlyCollection
aber wird diese Arbeit mit Entity Framework (v5)?
Wie würde ich das angehen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ein Weg ist, um die ICollection-geschützten Eigentum, und erstellen Sie eine neue Eigenschaft von IEnumerable, die einfach liefert die Liste der ICollection-Eigenschaft.
Den Nachteil mit diesem ist, dass Sie nicht in der Lage, eine Abfrage auf Adressen durch die ContactInfo wie bekommen alle contactinfo, dass das Leben in dieser Stadt.
Ist dies nicht möglich!:
Code:
Weitere option vorgeschlagen, die von Edo van Asseldonk ist zum erstellen einer benutzerdefinierten Auflistung, erbt Ihr Verhalten aus der Sammlung.
Würden Sie haben, um Ihre eigene Implementierung für ISet, aber das Prinzip ist das gleiche.
Durch ausblenden alle Methoden, die ändert die Liste und markiert Sie als veraltet Sie effektiv eine ReadOnlyCollection aber EF wird immer noch in der Lage sein, um es zu ändern, wenn es ohne Verpackung als Sammlung. In meiner version habe ich einen impliziten operator-Konvertierung für die Liste, so dass wir nicht haben, um unbox der Sammlung beim hinzufügen von Elementen:
Wo
und hier ist der EntityCollection:
Diese Weise können Sie noch Ihre Linq-wie üblich wird aber eine angemessene Warnung vor Nutzung, wenn Sie versuchen zu ändern, die Sammlung Eigentum. Un-boxing es eine Sammlung wäre die einzige Möglichkeit: