我正在尝试将使用 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,但仍然不可用
我最好的猜测是它用于外键的急切加载(我需要这样做,在请求中多次创建和处理上下文,并且不保证它会存在/附加时 FooModel被使用)
Entity Framework - eager loading of related entities显示我应该使用 .Include()
,但该功能在实际实体上似乎不可用(我认为该术语是“物化查询”?)
感谢阅读
最佳答案
.Load()
加载 IQueryable
从数据库查询到内存 - 事实上,Local
DbContext 相关实体的属性。
您可以将此方法用于任何 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>
实现IEnumerable
,就像 L2O 对象一样:
db.Products.Include("Category").Where(p => p.CatId == 10).Load();
string subName = db.Products.Local.Find(id).SubString(0, 4);
关于c# - Entity Framework .load(MergeOption) 做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18001862/