2010-04-19 3 views
1

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

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

Благодаря

ответ

2

This is a good place to start. Конечно, он один из главных вкладчиков NHibernate, так что конкретный пост может показаться немного предвзято, но есть некоторые хорошие ссылки и аргументы в комментариях.

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

1

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

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 полностью разрушает хороший дизайн OO принципалов, как потребители могут непосредственно получить доступ с помощью вызова Добавить операцию на ICollection.

Account acc = new Account(); 
acc.Customers.Add(new Customer()); //Bad code 

Первоначальное намерение класса домена было использовать метод общественного добавления:

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.

+0

Он также должен работать с использованием «внутреннего», который предоставляет только коллекцию другим классам в одной и той же сборке. –