我是Entity Framework的初学者。我有一些条款会产生问题。我正在考虑代码优先架构
1对1 通过在父类和子类中创建子类的属性来解决,我们将父类的id标记为外键。
喜欢
public class Parent{
//code
public Child Child{get; set;}
}
public class Child{
[ForeignKey("Parent")]
public int ParentId{get; set;}
}
我们使用的 1对多关系
public class Parent {
//code
public IList<Child> Child { get; set; }
}
public class Child {
[ForeignKey("Parent")]
public int ParentId{get; set;}
}
这是正确的做法吗?
\*-\*
来解决 IList<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
的目的是什么?
有人回答请解决我的困惑
答案 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