实体框架中虚拟的目的是什么?

Has*_*aan 1 c# asp.net entity-relationship entity-framework entity-framework-5

我是Entity Framework的初学者.我有一些条款会产生问题.我正在考虑代码优先架构

  1. 通过在父类中创建子类的属性来解决1对1,在子类中,我们将父类的id标记为外键.

    喜欢

    public class Parent{
       //code 
       public Child Child{get; set;}
    }
    
    public class Child{
       [ForeignKey("Parent")]
       public int ParentId{get; set;}
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 一个1对多的关系,我们使用

    public class Parent {
       //code 
       public IList<Child> Child { get; set; }
    }
    
    public class Child {
       [ForeignKey("Parent")]
       public int ParentId{get; set;}
    }
    
    Run Code Online (Sandbox Code Playgroud)

    这是正确的方法吗?

  3. \*-\*通过IList<class>在两个类中添加来解决.

但我解决问题,我有2班CategoriesProducts.

Product类中,属性定义为

public class Products {
   public virtual Category Category { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

Category课堂上,产品以这种方式被调用

public class Categories {
   public virtual ICollection<Product> Products { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我很困惑virtual Category产品的目的是什么?

有人回答请解决我的困惑

Dis*_*ile 6

正如其他人在评论中指出的那样,EF使用virtual关键字来启用延迟加载.它的方式是使用所谓的动态代理.

如果您正在调试,您可能会注意到您的实体类型不是您认为的那样:

代理类型的名称如下所示:System.Data.Entity.DynamicProxies .Blog_5E43C6C196972BF0754973E48C9C941092D86818CD94005E9A759B70BF6E48E6

实体框架看到您的实体具有虚拟关键字,并将通过从您的类继承并覆盖标记为虚拟的属性来创建动态代理,以便为这些属性启用延迟加载.

正如我链接到的msdn中所提到的,当您使用new关键字创建实体实例时,您将无法获得动态代理(因此不会延迟加载):

var blog1 = new Blog(); // not a dynamic proxy
var blog2 = db.Blogs.Create(); // this is a dynamic proxy
var blog3 = db.Blogs.Find(1); // this is a dynamic proxy
Run Code Online (Sandbox Code Playgroud)