为什么域对象(PO​​CO)的成员是虚拟的?

时间:2012-03-30 04:43:30

标签: c# entity-framework domain-driven-design repository-pattern

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; }
}
BTW,视频中的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中。这个与典型的相比如何?

3 个答案:

答案 0 :(得分:8)

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

要获得完整答案,您可能需要阅读Working with POCO EntitiesRequirements for Creating POCO Proxies

答案 1 :(得分:2)

使用Entity Framework时,属性必须是虚拟的才能支持延迟加载。

答案 2 :(得分:1)

来自msdn article; &#34;对于更改跟踪代理:

映射到数据模型中实体类型的属性的每个属性必须具有非密封(在Visual Basic中为NotOverridable),公共和虚拟(在Visual Basic中为可覆盖)get和set访问器。&#34;