我是 Entity Framework 的初学者。我有一些术语正在制造问题。我正在考虑代码优先模式
1对1通过在父类中创建子类的属性来解决,在子类中我们将父类的id标记为外键。
喜欢
public class Parent{ //code public Child Child{get; set;} } public class Child{ [ForeignKey("Parent")] public int ParentId{get; set;} }
我们使用的一对多关系
public class Parent { //code public IList<Child> Child { get; set; } } public class Child { [ForeignKey("Parent")] public int ParentId{get; set;} }
这是正确的做法吗?
\*-\*
通过添加IList<class>
解决在两个类(class)。
但我正在解决我有 2 个类的问题 Categories
和 Products
.
在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/