4

我正在尝试将使用 Entity Framework 4 的大型应用程序升级为使用 Entity Framework 5。我发现了这样的功能:

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

Wherefoobar是生成的实体,bar具有指向 的外键foo

好像EF5已经没有这个.Load(MergeOption)功能了,以前没见过。有谁知道它的作用,它的等价物是什么?

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


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

实体框架 - 相关实体的急切加载显示我应该使用.Include(),但该功能似乎在实际实体上不可用(我认为该术语是“物化查询”?)

谢谢阅读

4

1 回答 1

1

.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);
于 2013-08-03T11:11:27.430 回答