我有点难过.根据我的阅读设置DbContext.AutoDetectChangesEnabled,false应该禁用需要调用的更改跟踪DbContext.DetectChanges,以便识别要发送到数据库的更改.
但是,从我的下面的日志中可以清楚地看到,dbContexts更改跟踪器正在注册更改,即使设置为false也是如此.
我错过了什么吗?
实体框架版本:5.0.0.0
DbContext类
public class ProjectContext : DbContext {
public DbSet<Project> Projects {get;set;}
}
Run Code Online (Sandbox Code Playgroud)
控制器类
private ProjectContext db = new ProjectContext();
public method(){
Project p = new Project("uniqueName");
db.Configuration.AutoDetectChangesEnabled = false;
db.Projects.Add(p);
DebugChangeTracker();
db.SaveChanges();
db.Projects.First().ProjectName = "a differentName!";
DebugChangeTracker();
db.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)
记录方法
private void DebugChangeTracker()
{
var path = "C:\\mypath\\";
path = path + Util.GetMsSinceEpoch().ToString() + "changeTracker.log";
using (StreamWriter sw = new StreamWriter(path))
{
var changeTracker = db.ChangeTracker;
var entries = changeTracker.Entries(); …Run Code Online (Sandbox Code Playgroud) 有人可以解释一下
在调试模式下,如果我在没有调试的情况下启动项目,我的网页加载时间为116秒,而加载时为15秒.
我已经设置了跟踪语句,并确定在调试模式下,在我的DbContext.SaveChanges方法中花费了大约116秒.
运行项目而不调试在同一部分中花费7秒钟.
如果您想了解更多信息,请在评论中告诉我.
项目设置:
附加信息:(如果您需要更多,请在评论中告诉我)
更新:
正如@ruionwriting建议的那样,我描述了数据库,我发现,无论项目是在调试模式还是生产模式下运行,~2,000 sql命令都会花费相同的时间.(每个命令0毫秒).
但是,在调试模式下,20,000个命令之间的平均绝对时间差为5ms.
与生产模式相比,该组命令的平均时间差为0.3 ms.
这是大约10倍的时间性能差异,并将实体框架隔离为在调试模式下花费额外时间.
有没有办法配置调试版本,以便可以在没有调试标志的情况下引用EntityFramework?
如果我以某种方式通过一些编译器魔术来实现性能,那么在调试功能方面我会失去什么?目前我无法进入实体框架代码,所以我认为我不会错过任何东西.
谢谢!
asp.net performance intellitrace dbcontext entity-framework-5
在visual studio中很容易停止正在调试的程序(Debug - > Start Debugging),但是有没有办法停止没有调试启动的程序(Debug - > Start Without Debugging)?
更新:从视觉工作室内部.
在 ASP.NET WebApi2 中,如果存在内部服务器错误,即使启用了 CORS,也会在没有Access-Control-Allow-Origin 标头的情况下发送 500 响应。
这会导致浏览器报告 CORS 错误,而不是内部服务器错误。
我认为处于错误状态的服务器可能无法报告它将响应的来源,因此在我看来,浏览器应该处理这种特殊情况并报告内部错误,而不是 CORS 错误。
A ) 有没有办法让内部服务器错误显示在浏览器中作为我的请求失败的原因?
B) 浏览器是否应该就此提出问题?
我很好奇这个函数是否会决定字节序.
如果整数someInt存储在little endian中,则测试是一个等于1的位掩码.
在位掩码中,将0x1000转换为匹配机器的endian样式还是"常量"?
#include <stdio.h>
int isBigEndian(){
int someInt =0x0001;
if(someInt & 0x0100 == 1)
return 1;
else
return 0;
}
int main(){
int returnVal = isBigEndian();
printf("return val is %d", returnVal);
}
Run Code Online (Sandbox Code Playgroud)