实体框架首先访问数据库

Posted

技术标签:

【中文标题】实体框架首先访问数据库【英文标题】:Entity Framework first Access to Database 【发布时间】:2014-08-18 15:32:11 【问题描述】:

每次打开数据库连接时,与数据库的第一次交互都会花费大量时间。从第二次互动开始,“速度”要高得多。我认为这是对实体框架的优化,看起来不错。但即使我使用多个数据库,它仍然是一样的。与第一个数据库的第一次交互很慢。但是与第二个数据库的第一次交互很快。为什么与另一个数据库的第一次交互也不会很慢?另一个问题是初始化程序仅适用于第一个数据库。 (我认为这个问题是由这个优化引起的)

关于这个问题(我自己问的): Entity Framework 6 SetInitializer DbContext does not work for SQL Server Express and SQL Server Compact

有谁知道这种优化是如何工作的以及如何禁用它?我实际上并没有使用我比较它们的数据库,对于这种情况,禁用任何优化会很好。

【问题讨论】:

您检查过this article 和this post 吗? @YuliamChandra 非常感谢您提供的有用链接!这不是我问题的答案,因为他们想提高性能,但现在我知道我在寻找什么。 “如何强制数据库变冷?”谢谢! 【参考方案1】:

我写了一个答案,因为评论不合适。

对于 Yuliam 向您指出的好链接的速度。

对于其余部分,我不确定是否理解您的问题。

对我来说以下代码(相关摘录)

class Program 
    static void Main(string[] args) 
        Database.SetInitializer<TestEFContext>(new DropCreateDatabaseAlways<TestEFContext>());

        String cs = @"Data Source=ALIASTVALK;Initial Catalog=TestEF;Integrated Security=True; MultipleActiveResultSets=True";
        using (TestEFContext ctx = new TestEFContext(cs)) 
            Console.WriteLine(ctx.Orders.Count());
        

        cs = @"Data Source=ALIASTVALK;Initial Catalog=TestEF2;Integrated Security=True; MultipleActiveResultSets=True";
        using (TestEFContext ctx = new TestEFContext(cs)) 
            Console.WriteLine(ctx.Orders.Count());
                    
    

很好地创建和重新创建数据库 TestEF 和 TestEF2。

我误解你的问题了吗?

===== 回复评论:

在这种情况下,总是(重新)创建两个数据库:

首次运行:创建 使用 SSMS 填充某些表中的某些数据 第二次运行 使用 SSMS 检查表内容:表为空 数据库在第二次运行时重新创建。

与您的情况只有微不足道的区别:我使用的是 EF 6;

【讨论】:

您正确理解了我的问题。 (完美总结!Thx)你的代码看起来和我的一样安静(看看链接的帖子)。问题是第二个被调用的数据库只有在它不存在时才被(重新)创建,否则它不会被重新创建。首先调用哪个数据库无关紧要。 感谢您的帮助,我的代码看起来像您的。我从 app.config 中获取了连接字符串,但这应该不是问题。如果我有时间,我会重写我的代码并尝试各种解决方案。

以上是关于实体框架首先访问数据库的主要内容,如果未能解决你的问题,请参考以下文章

实体框架代码首先自定义字段,我不想映射到数据库

实体框架与数据访问层

实体框架代码首先使用现有数据库

使用实体框架核心生成和访问存储过程

实体框架代码在数据库迁移后首先回滚

C#:使用实体框架代码优先访问数据库