小编Pet*_*ter的帖子

如何"热身"实体框架?它何时变得"冷"?

不,我的第二个问题的答案不是冬天.

前言:

我最近一直在对Entity Framework进行大量的研究,而且一直困扰着我的是它在查询没有预热时的性能,所谓的冷查询.

我浏览了Entity Framework 5.0 的性能注意事项.作者介绍的概念,温暖寒冷的查询,以及他们如何不同,这我也注意到自己不知道它们的存在.在这里值得一提的是,我背后只有六个月的经验.

现在我知道如果我想在性能方面更好地理解框架,我还可以研究哪些主题.不幸的是,互联网上的大多数信息都是过时的或者是主观性的,因此我无法找到关于Warm vs Cold查询主题的任何其他信息.

基本上我到目前为止注意到的是,每当我必须重新编译或回收点击时,我的初始查询变得非常慢.正如预期的那样,任何后续数据读取都是快速的(主观的).

我们将迁移到Windows Server 2012,IIS8和SQL Server 2012,作为一名少年,我实际上赢得了在其他人之前测试它们的机会.我很高兴他们推出了一个预热模块,可以让我的应用程序为第一个请求做好准备.但是,我不确定如何继续升温我的实体框架.

我所知道的是值得做的:

  • 按照建议提前生成我的观点.
  • 最终将我的模型移动到单独的程序集中.

通过常识,我认为做的可能是错误的做法:

  • 在Application Start中执行虚拟数据读取,以便加热,生成和验证模型.

问题:

  • 什么是在我的实体框架上随时获得高可用性的最佳方法?
  • 在什么情况下实体框架再次"冷"?(重新编译,回收,IIS重启等)

asp.net asp.net-mvc entity-framework asp.net-mvc-4 entity-framework-5

118
推荐指数
3
解决办法
2万
查看次数

EF缓存:如何在将对象插入HttpRuntime缓存之前完全分离对象*?

一些背景:

使用:

  • .NET 4.5(考虑迁移到4.5.1,如果它是无痛的)
  • Web表单
  • 实体框架5,启用了延迟加载
  • 每个请求的上下文
  • IIS 8
  • Windows 2012 Datacenter

关注点:内存使用情况

在我们目前正在进行的项目上,可能是我们的第一个更大的项目,我们经常阅读一些来自CSV导入的大块数据,这些数据可能会在很长一段时间内保持不变.

除非有人明确地重新导入CSV数据,否则它们保证是相同的,这发生在我们项目中的多个位置,并且类似的方法用于一些常常由用户读取的常规文档.我们决定将这些数据缓存在HttpRuntime缓存中.

它是这样的,我们拉大约15,000条记录,主要是字符串.

//myObject and related methods are placeholders
public static List<myObject> GetMyCachedObjects()
{
    if (CacheManager.Exists(KeyConstants.keyConstantForMyObject))
    {
        return CacheManager.Get(KeyConstants.keyConstantForMyObject) as List<myObject>;
    }
    else
    {
        List<myObject> myObjectList = framework.objectProvider.GetMyObjects();
        CacheManager.Add(KeyConstants.keyConstantForMyObject, myObjectList, true, 5000);
        return myObjectList;
    }
}
Run Code Online (Sandbox Code Playgroud)

检索上述方法的数据非常简单,如下所示:

public List<myObject> GetMyObjects()
{
    return context.myObjectsTable.AsNoTracking().ToList();
}
Run Code Online (Sandbox Code Playgroud)

关于代码结构可能有些事情要说,但目前我并不关心这一点.

我一看到内存使用量很高就开始分析我们的项目,并发现许多部分可以优化我们的代码.我以前从未面对300个同时用户,我们自己完成的内部测试不足以显示内存问题.我已经突出显示并修复了许多内存泄漏,但我想了解一些与Entity Framework相关的未知数.

鉴于以上示例,并使用ANTS Profiler,我注意到' myObject '和其他类似对象引用了许多System.Data.Entity.DynamicProxies .myObject,此外还有许多EntityKeys可以保留整数.他们没有太多,但他们的数量相对较高.

例如,' myObject '的124个实例引用了近300个System.Data.Entity.DynamicProxies.

通常它看起来像这样,无论对象是什么: 一些缓存条目,一些我已缓存的对象,我现在注意到它们中的许多已经从dbContext事先缓存,动态代理和objectContext中分离出来.我不知道如何解开它们.

在此输入图像描述

我的进步:

我做了一些研究,发现我可能正在缓存实体框架与这些对象相关的东西.我用NoTracking拉它们但是内存中仍然存在那些可能还有其他东西的 …

asp.net caching memory-leaks entity-framework entity-framework-5

11
推荐指数
1
解决办法
992
查看次数

我怎样才能让这个文字一直坐到左边?

编辑:这是一个情况的小提琴.

好的,所以我正在建立一个网页,但我遇到了一个令人恼火的字体怪癖.似乎sans-serif字体拒绝准确地坐在他们所在的盒子的左边缘.

以下是一些用于演示此问题的实验性HTML:

<html>
<head>
    <style>
        .box {
            margin: 30px 0px 0px 30px;
            border: 1px solid #f00;
        }
    </style>
</head>
<body style="font-size: 36px;">
    <!-- text beginning with 'M', which has serifs protruding from the left side in a serif font -->
    <div class="box" style="font-family: 'Segoe UI';">My text</div> <!-- sans-serif -->
    <div class="box" style="font-family: 'Times New Roman';">My text</div> <!-- serif -->
    <div class="box" style="font-family: 'Arial';">My text</div> <!-- sans-serif -->
    <div class="box" style="font-family: 'Garamond';">My text</div> <!-- serif -->

    <!-- …
Run Code Online (Sandbox Code Playgroud)

html css

7
推荐指数
1
解决办法
138
查看次数

在使用Entity Framework和MySQL读取期间访问VARCHAR作为BINARY?

问题的基础:

双关语意图.

问题始于一个非常古老的dBase数据库,其中文本信息直接编码到DOS Cyrillic(CP-866)中,并且由于这不是一个问题,它每天晚上也被转移到MySQL数据库,我可以访问它.

我已经安装了MySQL Providers并使用Entity Framework连接到数据库,这是我的主要数据访问方法,然后出于实验原因使用纯ADO.NET.

在我试图将所谓的CP-866值从数据库转换为UTF-8之前,一切都比预期的要好,如下所示:

var cp866 = Encoding.GetEncoding(866);
var utf8 = Encoding.UTF8;

string source = "some unreadable set of characters from the database";
byte[] cp866bytes = cp866.GetBytes(source);
byte[] utf8bytes = Encoding.Convert(cp866, utf8, cp866bytes);
string result = utf8.GetString(utf8bytes);
Run Code Online (Sandbox Code Playgroud)

我用EntityFramework读了一次,用ADO.NET读了一次,结果相同.

对于当时未知和现在不太知名的原因,它没有用.在阅读了一些关于编码和字符串值的重要文章之后,我已经确定由于字符串变量本身的性质,不可能将这种转换应用于数据库中varchar字段的等效字符串.

以后几乎没有键盘爆炸,我终于通过使用ADO.NET MySQL Provider并通过将CONVERT(varcharColumn,Binary)添加到我正在测试的列来自定义我的查询.

从那时起,我使用上面的代码,唯一的区别是我已经从转换中获得了cp866字节数组.我原本打算做类似的事情,但MySQL提供程序无法直接从varchar字段读取字节,我也没有找到使用Entity Framework的方法.

是的,它有效,但即使对我没有经验的自我也感觉不对.



问题:

1:我可以指定实体框架应如何选择特定字段吗?

我想以某种方式解释我心爱的ORM,它应该在读取期间将特定varchar字段转换为二进制,而根本不返回字符串表示,因为它会混淆一切.

2:有没有办法让ADO.NET MySQL提供程序获取varchar字段的字节,而不是先将其作为字符串拉出来?

与varchar一起使用时,GetBytes方法抛出异常,并且MySQL版本中缺少通常存在于ADO.NET提供程序中的GetSqlBytes方法.我真的不想在我需要正确读取的每个字段上写二进制转换.

3:Bonus问题:是否可以像我一样读取CP-866编码的varchar字段作为字符串,但这次正确地将编码更改为UTF-8?

在今天的阅读之后,我的编码主题仍然存在很多混乱.我仍然相信可能有一些我缺少的东西,并且可以从cp-866编码的varchar字段中读取字符串,例如:

string cp866EncodedValue = "Œ€„‹… Œ‹€„…Ž‚€ Šš…‚€"; //actual copy-pasted value
Run Code Online (Sandbox Code Playgroud)

..然后将其转换为UTF-8,同时考虑到数据库中的字段是用CP-866编码的.从我所读到的,一旦它在一个字符串中,它是unicode,字符串是不可变的.我已经尝试了它的byre数组表示,将其更改为cp866,然后更改为utf8,我尝试使用它,因为它是cp866本身,但没有成功.

c# mysql asp.net entity-framework character-encoding

7
推荐指数
1
解决办法
1079
查看次数

EF,UoW和Repository - 何时在WebForms中部署UnitOfWork?

最近,我开始深入研究Repository Patterns和UnitOfWork的概念,同时探索EntityFramework.

基于MVC示例制作了我自己的实现,他们从Controller中处理UnitOfWork,如下所示:

protected override void Dispose(bool disposing)
{
    unitOfWork.Dispose(); 
    base.Dispose(disposing);
}
Run Code Online (Sandbox Code Playgroud)

我根本没有进入MVC,而且在Webforms中也很新,但是我认为它们会覆盖Controller dispose方法,以便将UnitOfWork作为"其他所有内容"处理掉.

基本上我想在我的ASP.NET WebForms网站中实现相同的概念,并将页面代码后面使用的UnitOfWork与处理页面本身一起处理.

我考虑过从生命周期中添加相同的Page_Unload事件,但我不确定这是否是正确的方法,因为我之前没有搞过这些事情.我的想法如下:

protected void Page_Unload(object sender, EventArgs e)
{
    unitOfWork.Dispose();
    base.Dispose();
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能安全地实现这一目标,我是否走在正确的轨道上?

asp.net dispose entity-framework unit-of-work repository-pattern

5
推荐指数
1
解决办法
1358
查看次数