为什么域对象(POCO)的成员被定义为虚拟的



在http://www.asp.net/mvc.模型对象成员在视频中间被更改为虚拟成员。他没有详细描述这一变化。谁能详细说明一下必要性吗?

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>创建一个类。这将所有模型对象放在一个接口RestaurantsReviews中。这个和典型的相比怎么样?

为了总结这一点,为了让POCO与EF一起工作,它创建了继承自原始实体类(POCO)的代理类。因此,它需要这些属性是虚拟的,以便覆盖它们,从而可以插入EF更改跟踪和延迟加载基础设施工作。否则,默认情况下不会启用更改跟踪或延迟加载。

要获得完整答案,您可能需要阅读《使用POCO实体和创建POCO代理的要求》

使用实体框架时,属性必须是虚拟的,才能支持延迟加载。

来自msdn文章;"对于更改跟踪代理:

映射到数据模型中实体类型的属性的每个属性都必须具有非密封的(在Visual Basic中为NotOverridable)、公共的和虚拟的(在VisualBasic中为Overridable)获取和设置访问器。"

最新更新