5

http://www.asp.net/mvc的複數視頻。模型對象成員在視頻中被改爲虛擬。他沒有詳細描述這一變化。任何人都可以闡述必要性嗎?爲什麼域對象(PO​​CO)的成員是虛擬的?

public class Restaurant 
{ 
    public virtual int ID { get; set; } 
    public virtual string Name { get; set; } 
    public virtual Address Address { get; set; } 
    public virtual ICollection<Review> Reviews { get; set; } 
} 

順便說一句,是IDBContext在視頻之後的存儲庫模式?如果代碼不是使用存儲庫模式進行最佳實踐,那麼該代碼應該如何使用

public interface IDbContext 
{ 
    IQueryable<Restaurant> Restaurants { get; } 
    IQueryable<Review> Reviews { get; } 
    int SaveChanges(); 
    T Attach<T>(T entity) where T : class; 
    T Add<T>(T entity) where T : class; 
    T Delete<T>(T entity) where T : class; 
} 

更新:這應該是一個多種資源庫模式。通常存儲庫模式爲一個模型對象IRepository<T>創建一個類。這一個把所有的模型對象放在一個界面Restaurants,Reviews。這個與一個典型的相比如何?

+0

POCO不應該是域對象。在你的例子中,每個實體都是PERSISTENCE模型,而不是DOMAIN。存儲庫模式不會爲一個模型對象創建一個類。它提供了一個抽象,並作爲持久訪問的外觀,在這種情況下是EF orm。 – MikeSW 2012-03-31 09:19:04

回答

8

總而言之,要使POCO與EF協同工作,它會創建繼承自原始實體類(POCO)的代理類。所以它需要虛擬屬性才能覆蓋它們,以便它可以插入EF更改跟蹤和延遲加載基礎結構工作。 否則,默認情況下不會啓用更改跟蹤或延遲加載。

有關完整的答案,這個你可能需要閱讀Working with POCO EntitiesRequirements for Creating POCO Proxies

2

使用實體框架時,屬性必須是虛擬的以支持延遲加載。

1

msdn article; 「對於更改跟蹤代理:

每個映射到數據模型中的實體類型的屬性的屬性都必須具有非密封(在Visual Basic中爲NotOverridable),public和virtual(在Visual Basic中爲Overridable)get並設置訪問器。「

相關問題