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

C# 为什么域对象(POCO)的成员定义为虚拟?,c#,entity-framework,domain-driven-design,repository-pattern,C#,Entity Framework,Domain Driven Design,Repository Pattern,在的多视距视频中。模型对象成员在视频中间被改变为虚拟。他没有详细描述这一变化。有人能详细说明一下必要性吗 public class Restaurant { public virtual int ID { get; set; } public virtual string Name { get; set; } public virtual Address Address { get; set; } public virtual ICollection<Rev

在的多视距视频中。模型对象成员在视频中间被改变为虚拟。他没有详细描述这一变化。有人能详细说明一下必要性吗

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; }
}


更新:它应该是多种存储库模式。通常,存储库模式为一个模型对象创建一个类
IRepository
。这一个将所有模型对象放在一个界面中
餐厅
评论
。这个和典型的相比怎么样

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

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

要完整回答此问题,您可能需要阅读和

; “对于更改跟踪代理:


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

POCO不应是域对象。在您的示例中,每个实体都是持久性模型,而不是域。存储库模式不会为一个模型对象创建一个类。它提供了一个抽象,并充当持久性访问的门面,在本例中是eform。
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;
}