相关疑难解决方法(0)

为什么Contains()运算符会如此显着地降低Entity Framework的性能?

更新3:根据此公告,EF团队在EF6 alpha 2中已经解决了这个问题.

更新2:我已经创建了一个解决此问题的建议.要投票,请到这里.

考虑一个带有一个非常简单的表的SQL数据库.

CREATE TABLE Main (Id INT PRIMARY KEY)
Run Code Online (Sandbox Code Playgroud)

我用10,000条记录填充表格.

WITH Numbers AS
(
  SELECT 1 AS Id
  UNION ALL
  SELECT Id + 1 AS Id FROM Numbers WHERE Id <= 10000
)
INSERT Main (Id)
SELECT Id FROM Numbers
OPTION (MAXRECURSION 0)
Run Code Online (Sandbox Code Playgroud)

我为表构建EF模型并在LINQPad中运行以下查询(我使用"C#语句"模式,因此LINQPad不会自动创建转储).

var rows = 
  Main
  .ToArray();
Run Code Online (Sandbox Code Playgroud)

执行时间约为0.07秒.现在我添加Contains运算符并重新运行查询.

var ids = Main.Select(a => a.Id).ToArray();
var rows = 
  Main
  .Where (a => ids.Contains(a.Id))
  .ToArray();
Run Code Online (Sandbox Code Playgroud)

这种情况的执行时间是20.14秒(慢288倍)!

起初我怀疑为查询发出的T-SQL需要更长的时间才能执行,因此我尝试将其从LINQPad的SQL窗格剪切并粘贴到SQL Server Management Studio中.

SET …
Run Code Online (Sandbox Code Playgroud)

c# sql performance contains entity-framework-4

79
推荐指数
5
解决办法
4万
查看次数

自创建数据库以来,支持'--Context'上下文的模型已更改 - 但db是新的生产数据库

我在第762次遇到这个错误,但是这次我在尝试访问我的生产网站后立即获取它,直接删除Azure上的"生产"数据库然后发布我的网站.

The model backing the 'PropertyContext' context has changed since the database was created. Consider using Code First Migrations to update the database
Run Code Online (Sandbox Code Playgroud)

我删除了数据库,因为我无法以任何其他方式修复此问题,但它仍然无法正常工作.

一些要点:

  • 我正在使用EF6并发布到Azure.
  • 这是使用相同Repo项目的2个项目/站点中的1个.我
    对另一个没问题,就是这个问题.
  • 我已经尝试首先发布问题项目(在删除数据库之后),然后使用相同的结果发布.
  • 我尝试从Azure中删除WEBSITES和DB,然后重新开始
  • 我尝试删除所有迁移并从新数据模型开始
  • 我在我的Global.asax中尝试了以下内容(在两个项目中)

    Database.SetInitializer PropertyContext>(null); < - SO不会让我把第一个<

Database.SetInitializer(new MigrateDatabaseToLatestVersion<PropertyContext, MyConfiguration>());
new PropertyContext().Database.Initialize(true);
Run Code Online (Sandbox Code Playgroud)

我正在使用.net 4.5

为什么我在新数据库上收到此错误,如何才能使此站点正常工作?

c# entity-framework azure

24
推荐指数
3
解决办法
5万
查看次数