Коллекции Entity Framework только для чтения

Рассмотрим домен, в котором у клиента, компании, сотрудника и т. д. есть свойство ContactInfo, которое, в свою очередь, содержит набор адресов (es ), Phone (es ), Email (s ), и т. д., и т. д.

Вот моя сокращенная 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);
    }
}

Некоторые примечания (Я не уверен на 100%, что это «лучшие практики» EF):

  • набор адресов (es )является виртуальным, чтобы обеспечить ленивую загрузку
  • частный сеттер коллекции запрещает замену коллекции
  • коллекция — это ISet, чтобы гарантировать отсутствие дубликатов адресов для каждого контакта
  • используя метод AddAddress, я могу гарантировать, что всегда и не более 1 адреса является первичным....

Я хотел бы, чтобы (, если это возможно, )предотвращало добавление адресов с помощью метода ContactInfo.Addresses.Add()и принудительно использовало ContactInfo.AddAddress(Address address)...

Я думаю открыть набор адресов через ReadOnlyCollection, но будет ли это работать с Entity Framework (v5 )?

Как бы я это сделал?

18
задан zam6ak 25 June 2012 в 14:19
поделиться