EF4有哪些主要限制?

时间:2010-04-19 22:29:40

标签: entity-framework entity-framework-4

我正在尝试为我的项目决定一个ORM工具,我正在考虑EF4。

此产品的主要(如果有)烦恼/限制是什么?此外,它是否支持缓存?

由于

2 个答案:

答案 0 :(得分:2)

This is a good place to start.虽然他是NHibernate的主要贡献者之一,所以特定帖子可能看起来有点偏颇,但评论中有一些很好的链接和论点。

看起来好几个月前有人在SO问了一个非常相似的问题。

答案 1 :(得分: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方法来限制对customers集合的访问。通常,您希望在添加或删除新客户之前进行一些业务检查。

当前版本的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上的Add Operation来直接访问。

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类与域模型位于同一个程序集中!

Lazing加载集合需要实现ICollection的公共或受保护类型。