0

我有客户和订单实体。在使用 fluent hibernate 为客户定义类时,为什么我们需要为 Orders 列表属性指定“保护集”。

public virtual IList<Order> Orders { get; protected set; }
4

1 回答 1

2

您不需要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
于 2012-09-11T22:11:33.857 回答