我正在尝试升级使用Entity Framework 4的大型应用程序来使用Entity Framework 5。 我发现了这样一个函数:
public FooModel(FooEntity foo)
{
_foo = foo;
_foo.bars.Load(System.Data.Objects.MergeOption.OverwriteChanges);
}
生成foo
和bar
的实体,其中bar
具有foo
的外键。
似乎EF5不再具有.Load(MergeOption)
功能,我以前从未见过它。
有谁知道它做了什么,它的等价物是什么?
https://stackoverflow.com/a/13178313/784908表明Load
是DbContext的一部分 - 但我的实体容器继承自DbContext,但仍然不可用
我最好的猜测是它用于外键的Eager加载(我需要做的事情,在请求中多次创建和处理上下文,并且当FooModel没有保证它将存在/附加使用)
Entity Framework - eager loading of related entities显示我应该使用.Include()
,但该功能似乎在实际实体上不可用(我认为该术语是'物化查询'?)
感谢您阅读
答案 0 :(得分:1)
.Load()
将IQueryable
查询从数据库加载到内存中 - 实际上是DbContext相关实体的Local
属性。
您可以将此方法用于任何IQueryable集合,而不仅仅是DbContext。示例如下:
var q = db.Products.Include("Category").ToList();
q.Load(); // -> you can't!
// ------------
db.Products.Include("Category").Load(); // It's OK!
// This will NOT query the database, just looks in-memory data.
var p = db.Products.Local.Single(id);
// ------------
var q = db.Products.Include("Category").ToList();
q.AsQueryable().Load(); // -> It's OK!
// This also will NOT query the database, just looks in-memory data.
var p = db.Products.Local.Single(id);
加载功能主要有两个原因:
1)从Db中检索数据的某些部分到内存并使用它们:
db.Products.Include("Category").Where(p => p.CatId == 10).Load();
2)能够使用L2E不支持的Linq-to-Objects方法(如.ToString()等) - 因为DbContext实体的Local属性是ObservableCollection<T>
,它实现了{{ 1}},就像L2O对象一样:
IEnumerable