实体框架.load(MergeOption)有什么作用?

时间:2013-08-01 18:33:15

标签: c# linq entity-framework-5

我正在尝试升级使用Entity Framework 4的大型应用程序来使用Entity Framework 5。 我发现了这样一个函数:

public FooModel(FooEntity foo)
{
    _foo = foo;
    _foo.bars.Load(System.Data.Objects.MergeOption.OverwriteChanges);
}

生成foobar的实体,其中bar具有foo的外键。

似乎EF5不再具有.Load(MergeOption)功能,我以前从未见过它。 有谁知道它做了什么,它的等价物是什么?

https://stackoverflow.com/a/13178313/784908表明Load是DbContext的一部分 - 但我的实体容器继承自DbContext,但仍然不可用


我最好的猜测是它用于外键的Eager加载(我需要做的事情,在请求中多次创建和处理上下文,并且当FooModel没有保证它将存在/附加使用)

Entity Framework - eager loading of related entities显示我应该使用.Include(),但该功能似乎在实际实体上不可用(我认为该术语是'物化查询'?)

感谢您阅读

1 个答案:

答案 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