Consider a domain where a Customer, Company, Employee, etc, etc, have a ContactInfo property which in turn contains a set of Address(es), Phone(es), Email(s), etc, etc...
Here is my abbreviated 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);
}
}
Some notes (I am not 100% sure if these are EF "best practices"):
- collection of Address(es) is virtual to allow for lazy loading
- private setter on collection prohibits collection replacement
- collection is an
ISet
to insure that there are no duplicate addresses per contact - using
AddAddress
method I can insure that there is always and at most 1 address which is primary....
I would like (if possible) to prevent adding Addresses via ContactInfo.Addresses.Add()
method and to force using of ContactInfo.AddAddress(Address address)
...
I am thinking exposing the set of addresses via ReadOnlyCollection
but will this work with Entity Framework (v5)?
How would I go about this?