为什么域对象(POCO)的成员被定义为虚拟的
本文关键字:成员 虚拟 定义 对象 POCO 为什么 | 更新日期: 2023-09-27 18:29:34
在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>
创建一个类。这将所有模型对象放在一个接口Restaurants
、Reviews
中。这个和典型的相比怎么样?
为了总结这一点,为了让POCO与EF一起工作,它创建了继承自原始实体类(POCO)的代理类。因此,它需要这些属性是虚拟的,以便覆盖它们,从而可以插入EF更改跟踪和延迟加载基础设施工作。否则,默认情况下不会启用更改跟踪或延迟加载。
要获得完整答案,您可能需要阅读《使用POCO实体和创建POCO代理的要求》
使用实体框架时,属性必须是虚拟的,才能支持延迟加载。
来自msdn文章;"对于更改跟踪代理:
映射到数据模型中实体类型的属性的每个属性都必须具有非密封的(在Visual Basic中为NotOverridable)、公共的和虚拟的(在VisualBasic中为Overridable)获取和设置访问器。"