我的EF 4.3.1模型有200多个表.最初的启动很糟糕,几分钟.DotTrace捕获的配置文件意味着在框架深处有一些可怕的算法/可伸缩性选择,这可以通过数百万次调用那些方法以及3600万个IEnumerable.Contains()调用来证明.这是一个片段,这是由在数据库上完成的第一个查询触发的(未来的查询不会这样做并且没问题).

我可以对我的模型做些什么来减轻痛苦?我能以某种方式预先编译吗?更好的是,EF团队可以解决这些问题或开源框架,以便我可以吗?或者至少修正拼写Warapper?:)
编辑:一个特定的EF调用触发这个基本上是var db = new MyDbContext(); db.Personnel.Where(a => a.Login == login).SingleOrDefault();.此外,EF Migrations Seed()AddOrUpdate可以有效地生成相同的堆栈.更完整的堆栈跟踪,可能会提供更多的上下文,在这里:富勒堆栈跟踪
编辑:一些相关链接:
EDIT2:现在他们刚刚开源代码,看来这行:
//Filter the 1:1 foreign key associations to the ones relating the sets used in these cell wrappers.
oneToOneForeignKeyAssociationsForThisWrapper =
oneToOneForeignKeyAssociationsForThisWrapper.Where(
it => (it.AssociationEndMembers.All(endMember => entityTypes.Contains(endMember.GetEntityType()))));
Run Code Online (Sandbox Code Playgroud)
是需要一些工作的人.当它可能没有时,它正在使用O(n ^ 2)算法,但我还没有仔细观察.
编辑3:令人高兴的是,看起来EF6中的工作正在修复此代码:http://entityframework.codeplex.com/discussions/396130
我对ASP.NET MVC应用程序中实体框架上下文的期望生命周期有一些疑问.是不是最好尽可能在最短的时间内保持上下文?
请考虑以下控制器操作:
public ActionResult Index()
{
IEnumerable<MyTable> model;
using (var context = new MyEntities())
{
model = context.MyTable;
}
return View(model);
}
Run Code Online (Sandbox Code Playgroud)
上面的代码将不起作用,因为在视图呈现页面时,实体框架上下文已超出范围.其他人如何构建上面的代码?
我正在尝试通过缓存查询来提高Web应用程序的性能.
public static Func<myEntity, List<HASHDuplicates>, IQueryable<FormResponse>> CompiledDuplicatedResponses =
CompiledQuery.Compile<myEntity, List<HASHDuplicates>, IQueryable<FormResponse>>(
(db, hashes) => from r in db.FormResponse
from h in db.IndexHASHes
from d in hashes
where r.id == h.FormResponseID && h.IndexHASHString == d.hash
select r);
Run Code Online (Sandbox Code Playgroud)
我收到的错误是在编译时:
类型'myEntity'不能在泛型类型或方法'System.Data.Entity.Core.Objects.CompiledQuery.Compile(System.Linq.Expressions.Expression>)'中用作类型参数'TArg0'.没有从'myEntity'到'System.Data.Entity.Core.Objects.ObjectContext'的隐式引用转换.
我正在使用EF6
从我的集成测试:
// Act
Stopwatch w = new Stopwatch();
w.Start();
userService.Create(userDTO);
w.Stop();
public void Create(UserDTO userDTO)
{
var user = userDTO.ToEntity();
_context.Entry(user).State = EntityState.Added;
_context.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)
6,2秒做"sql插入"是疯了.我已经看到应用程序用户在第一次打开他们使用全年的项目时抱怨.所以每天都要等6秒......
我认为EF6的预热时间有所改善?
我能做些什么来改善这种悲惨的行为吗?