在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>
创建一个类。这个将所有模型对象放在一个接口Restaurants
,Reviews
中。这个与典型的相比如何?
答案 0 :(得分:8)
总结一下,为了让POCO与EF一起工作,它创建了从原始实体类(POCO)继承的代理类。因此,它需要虚拟属性以覆盖它们,以便它可以插入EF更改跟踪和延迟加载基础结构工作。 否则,默认情况下不会启用更改跟踪或延迟加载。
要获得完整答案,您可能需要阅读Working with POCO Entities和Requirements for Creating POCO Proxies
答案 1 :(得分:2)
使用Entity Framework时,属性必须是虚拟的才能支持延迟加载。
答案 2 :(得分:1)
来自msdn article; &#34;对于更改跟踪代理:
映射到数据模型中实体类型的属性的每个属性必须具有非密封(在Visual Basic中为NotOverridable),公共和虚拟(在Visual Basic中为可覆盖)get和set访问器。&#34;