gpt4 book ai didi

c# - Entity Framework 中虚拟的目的是什么?

转载 作者:太空宇宙 更新时间:2023-11-03 19:07:51 24 4
gpt4 key购买 nike

我是 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. 我们使用的一对多关系

    public class Parent {
    //code
    public IList<Child> Child { get; set; }
    }

    public class Child {
    [ForeignKey("Parent")]
    public int ParentId{get; set;}
    }

    这是正确的做法吗?

  3. \*-\*通过添加 IList<class> 解决在两个类(class)。

但我正在解决我有 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 的目的是什么在产品中?

请大家解答一下,解决我的困惑

最佳答案

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

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

Proxy types have names that look something like this: System.Data.Entity.DynamicProxies .Blog_5E43C6C196972BF0754973E48C9C941092D86818CD94005E9A759B70BF6E48E6

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

正如我链接到的 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

关于c# - Entity Framework 中虚拟的目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24373172/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com