2010-04-19 62 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的客戶完全破壞良好的面向對象設計原則,因爲消費者可以直接通過調用ICollection的添加操作訪問。

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

域類的初衷是爲了使用公共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的。

+0

它應該使用「內部」,以及只將集合暴露給同一程序集中的其他類。 – 2011-03-22 19:23:09