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

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

    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/

相关文章:

c# - 无法解释错误消息 'async is not valid for this item'

c# - ASP.NET 中的 <img> 标记处出错

c# - 如何通过表单在 ASP.NET Web API 中实现 Active Directory 身份验证?

entity-framework - Azure 函数和 PowerShell : unable to set connection strings with Set-AzWebApp

c# - AutoFixture.AutoMoq 为一个构造函数参数提供一个已知值

c# - 在 app.config 中加密连接字符串

c# - 单击按钮时如何调用 Controller ?

asp.net - IIS 6.0 未反射(reflect) .cs 文件更改

entity-framework - 使用 Entry<TEntity>().CurrentValues.SetValues() 不会更新集合

javascript - 使用按钮加载 View 单击新页面 MVC