Каковы основные ограничения EF4? - PullRequest
1 голос
/ 20 апреля 2010

Я пытаюсь выбрать инструмент ORM для своего проекта и думаю об EF4.

Каковы основные (если таковые имеются) раздражения / ограничения с этим продуктом? Кроме того, он поддерживает кеширование?

Спасибо

Ответы [ 2 ]

2 голосов
/ 20 апреля 2010

Это хорошее место для начала. Конечно, он один из основных участников NHibernate, так что конкретный пост может показаться немного предвзятым, но в комментариях есть некоторые хорошие ссылки и аргументы. 1003 *

И похоже, что кто-то задал очень похожий вопрос SO несколько месяцев назад.

1 голос
/ 24 мая 2010

Невозможность использовать частные резервные поля для отложенной загрузки коллекций. Например, возьмите этот класс:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...