我有客户和订单实体。在使用 fluent hibernate 为客户定义类时,为什么我们需要为 Orders 列表属性指定“保护集”。
public virtual IList<Order> Orders { get; protected set; }
我有客户和订单实体。在使用 fluent hibernate 为客户定义类时,为什么我们需要为 Orders 列表属性指定“保护集”。
public virtual IList<Order> Orders { get; protected set; }
您不需要protected
在 setter 上指定。这样做只是一个很好的设计。
如果在 setter 上未指定访问修饰符,它将隐式具有与属性本身相同的访问修饰符(public
在您的情况下)。当 setter 为公共时,您的类的任何使用者都可以修改该Orders
属性并将其设置为另一个实例。
public class Customer
{
public virtual IList<Order> Orders { get; set; }
}
var customer = new Customer();
customer.Orders = new List<Order>();
在 setter 上定义protected
访问修饰符时,只有继承的类才能修改属性。对于任何其他消费者,该Orders
属性显示为只读。这实际上是一种封装。
NHibernate 默认使用延迟加载。这是一种技术,其中某些属性(通常是列表)不会立即加载,而是在第一次使用时加载。NHibernate 通过代理实现了这一点。动态创建的代理类从您的Entity
类继承并覆盖它的所有属性。这就是你virtual
对所有班级成员的原因。
而且,直截了当,当您定义时,protected set
您允许 NHibernate 的动态代理修改您的Orders
属性。Orders
可以初始化为一些空的代理集合,当有人尝试读取它时,将触发数据库加载,并且Orders
属性将替换为从数据库加载的 Order 实例列表。
public class Customer
{
public virtual IList<Order> Orders { get; protected set; }
}
var customer = new Customer();
//customer.Orders = new List<Order>(); // error: can't modify property
var orderCount = customer.Orders.Count; // this will trigger lazy-loading