我有客戶和訂單實體。在爲使用流暢Hibernate的客戶定義類時,爲什麼我們需要爲訂單列表屬性指定「受保護集」。爲什麼要保護一對多的關係屬性
public virtual IList<Order> Orders { get; protected set; }
我有客戶和訂單實體。在爲使用流暢Hibernate的客戶定義類時,爲什麼我們需要爲訂單列表屬性指定「受保護集」。爲什麼要保護一對多的關係屬性
public virtual IList<Order> Orders { get; protected set; }
您不需要在設置者上指定protected
。這只是一個很好的設計。
如果setter上沒有指定訪問修飾符,它將默認具有與屬性本身相同的訪問修飾符(在您的案例中爲public
)。當setter是公開的時候,你的班級的任何消費者都可以修改Orders
屬性並將其設置爲另一個實例。
public class Customer
{
public virtual IList<Order> Orders { get; set; }
}
var customer = new Customer();
customer.Orders = new List<Order>();
當你定義在二傳手protected
訪問修飾符,只有繼承的類將能夠修改屬性。對於其他任何消費者,Orders
屬性顯示爲只讀。這實際上是一個encapsulation。
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