Невозможность использовать частные резервные поля для отложенной загрузки коллекций. Например, возьмите этот класс:
public class Account
{
private IList<Customer> _customers = new List<Customer>();
public IEnumerable<Customer> Customers
{
get { return _customers ; }
}
public void AddCustomer(Customer customer)
{
//Perform some biz rules
_customers.Add(customer)
}
}
Доступ к коллекции клиентов ограничен использованием коллекции IEnumerable и наличием методов AddCustomer / RemoveCustomer в классе. Обычно вы хотите проверить бизнес перед добавлением или удалением нового клиента.
Текущая версия EF требует, чтобы типы отложенной загрузки коллекции были ICollection (или любой тип, который реализует ICollection). Таким образом, вышеприведенный класс теперь будет выглядеть так:
public class Account
{
private IList<Customer> _customers = new List<Customer>();
public virtual ICollection<Customer> Customers
{
get { return _customers ; }
}
public void AddCustomer(Customer customer)
{
//Perform some biz rules
_customers.Add(customer)
}
}
Использование общедоступной ICollection Клиенты полностью разрушают хорошие принципы проектирования ОО, поскольку потребители могут получить прямой доступ, вызвав операцию Добавить в ICollection.
Account acc = new Account();
acc.Customers.Add(new Customer()); //Bad code
Первоначальное намерение класса домена состояло в том, чтобы использовать метод public add:
Account acc = new Account();
acc.AddCustomer(new Customer());
NHibernate может справиться с этим сценарием посредством конфигурации. Мне бы очень хотелось, чтобы этот сценарий был поддержан в EF.
Обратите внимание, что для этого ограничения есть обходной путь, объявляя защитное поле защищенным и отображая его через конфигурацию:
public class Account
{
protected virtual ICollection<Customer> _customers = new Collection<Customer>();
public IEnumerable<Customer> Customers
{
get { return _customers ; }
}
public void AddCustomer(Customer customer)
{
//Perform some biz rules
_customers.Add(customer)
}
}
Но это не сработает, если ваше приложение имеет многоуровневую архитектуру (т. Е. Модель вашего домена отделена от классов конфигурации EF), поскольку защищенные типы недоступны для внешних классов.
Для того, чтобы это работало, классы EF должны быть в той же сборке, что и модели вашего домена!
Для отложенной загрузки коллекций требуется открытый или защищенный тип, который реализует ICollection.