我正在尝试为我的项目决定一个ORM工具,我正在考虑EF4。
此产品的主要(如果有)烦恼/限制是什么?此外,它是否支持缓存?
由于
答案 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的公共或受保护类型。