|
|
性感的大象 · VS错误的解决解决:LINK fatal ...· 1 年前 · |
|
|
粗眉毛的硬币 · 时间序列分解1 - 知乎· 2 年前 · |
|
|
成熟的西瓜 · Running Blender ...· 2 年前 · |
正如标题所示,我在使用实体框架对Server数据库进行第一个查询时遇到了问题。我曾试图寻找答案,但似乎没有人真正有办法解决这个问题。
这些测试是在Visual 2012中使用实体框架6完成的,我还使用T4视图模板预编译视图。数据库位于Server 2008上。我们有大约400个POCOs (400个映射文件),数据库表中只有100行数据。
下面的捕获是我的测试代码和结果。
static void Main(string[] args){
Stopwatch st=new Stopwatch();
st.Start();
new TestDbContext().Set<Table1>.FirstOrDefault();
st.stop();
Console.WriteLine("First Time "+st.ElapsedMilliseconds+ " milliseconds");
st.Reset();
st.Start();
new TestDbContext().Set<Table1>.FirstOrDefault();
st.stop();
Console.WriteLine("Second Time "+st.ElapsedMilliseconds+ " milliseconds");
}
测试结果
First Time 15480 milliseconds
Second Time 10 milliseconds
在第一个查询中,EF编译模型。对于这么大的模型来说,这可能需要一些严肃的时间。
摘要:
我还将确保在执行基准测试时,以发布模式编译应用程序。
另一个解决方案是考虑拆分DBContext。400个实体非常多,与较小的块一起工作应该更好。我还没有试过,但我认为可以一个接一个地构建模型,这意味着没有单一的负载需要15s。参见朱莉·勒曼 https://msdn.microsoft.com/en-us/magazine/jj883952.aspx 撰写的这篇文章
我认为这不是一个很好的解决办法。Ado.net看起来性能要好得多。不过,这是我的意见。
或者看看他们。
https://msdn.microsoft.com/tr-tr/data/dn582034
https://msdn.microsoft.com/en-us/library/cc853327(v=vs.100).aspx
这是我的工作:
using (MyEntities db = new MyEntities())
db.Configuration.AutoDetectChangesEnabled = false; // <----- trick
db.Configuration.LazyLoadingEnabled = false; // <----- trick
DateTime Created = DateTime.Now;
var obj = from tbl in db.MyTable
where DateTime.Compare(tbl.Created, Created) == 0
select tbl;
dataGrid1.ItemsSource = obj.ToList();
dataGrid.Items.Refresh();
}
你可以试试这样的方法:(这对我有用)
protected void Application_Start()
Start(() =>
using (EF.DMEntities context = new EF.DMEntities())
context.DMUsers.FirstOrDefault();
private void Start(Action a)
a.BeginInvoke(null, null);
}
使用EF,您可以在调用
services.AddDbContext
后早期欺骗和加载模型(您可能也可以使用EF6进行类似的操作,但我还没有对其进行测试)。
services.AddDbContext<MyDbContext>(options => ...);
var options = services.BuildServiceProvider()
.GetRequiredService<DbContextOptions<MyDbContext>>();
Task.Run(() =>
|
|
粗眉毛的硬币 · 时间序列分解1 - 知乎 2 年前 |