请考虑以下代码:
private void Form1_Load(object sender, EventArgs e)
{
//Initialize the ObjectContext
storeContext = new storeEntities();
gridControl.DataSource = storeContext.Products;
}
当加载Form1时,即使没有明确填写产品列表,gridControl也已经填充了产品列表。使用数据集时,必须显式加载表(通过调用fill或get方法),这是有意义的。
我的问题是
1 - 如果这是默认行为,是否意味着我正在访问的对象上下文中的其他实体也会自动填充?
2 - 如果是,我可以覆盖此行为吗?怎么样?
提前致谢,
愤怒
答案 0 :(得分:1)
当加载Form1时,即使没有明确填写产品列表,gridControl也已经填充了产品列表。
您将网格控件的数据源绑定到Products
表。换句话说,您要求网格控件查看storeContext.Products
的内容 - 这将检索数据。
如果这是默认行为,是否意味着我不会自动填充对象上下文中的其他实体?
不,只有你要求的那些。请参阅Øyvind的答案,了解与您已加载的实体相关的实体的详细信息。
如果是,我可以覆盖此行为吗?怎么样?
只是不要将网格控件的数据源设置为storeContext.Products
。如果您想稍后获取数据,请稍后再进行绑定。您可以绑定到空列表,并在以后明确填充它,如果您愿意的话。
答案 1 :(得分:0)
延迟加载是Entity Framework的默认设置,这意味着链接到其他表的属性不会自动填充,但会在代码需要/访问时从数据库中获取。因此,例如序列化对象将获取所有相关数据,因为序列化程序遍历对象上的所有属性以将它们保存在某种序列化状态。
要停止此操作,您可以在上下文中关闭延迟加载:
objectContext.LazyLoadingEnabled = false;
这会导致相关属性在获得正确值之前需要显式加载,通常在编写查询本身时使用Include
关键字来指示您想要获取哪些相关数据还提取主要数据。