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

时间:2014-06-23 18:48:27

标签: c# asp.net entity-framework entity-framework-5 entity-relationship

我是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;}
    }
    
  2. 我们使用的 1对多关系

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

    这是正确的做法吗?

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

  5. 但我正在解决一个问题,即我有2个班CategoriesProducts

    Product类中,属性定义为

    public class Products {
       public virtual Category Category { get; set; }
    }
    

    Category课程中,产品以这种方式调用

    public class Categories {
       public virtual ICollection<Product> Products { get; set; }
    }
    

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

    有人回答请解决我的困惑

1 个答案:

答案 0 :(得分:6)

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

如果您正在调试,您可能会注意到您的实体类型不符合您的想法:

  

代理类型的名称如下所示:   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