Рассмотрите домен, в котором у Клиента, Компании, Сотрудника и т. Д. И т. Д. Есть свойство ContactInfo, которое, в свою очередь, содержит набор адресов, Телефон (ы), Электронный адрес (ы) и т. Д. и т.д ...Entity Framework только для чтения
Вот мое сокращенное 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)?
Как бы я это сделал?
Нельзя ли отличать IEnumerable от ISet и делать всю магию, которая должна быть скрыта впоследствии? –
@Michael К сожалению, это не вариант для меня ... Мне нужно иметь возможность запросить ... – zam6ak
Вначале он не работает в коде. EF не создает таблицы для защищенного набора/набора. – 101V