2013-03-19 92 views
2

我正在学习实体框架,目前我正面临一个问题,我需要大约10秒钟才能从数据库中检索数据或更新行,就好像我的代码实际上停留了一段时间的时间,即使调试它一切正常。实体框架CodeFirst延迟经验

代码本身实际上按预期工作,除了这个延迟。

在谷歌上搜索,在这里我没有发现其他人与这个问题有关的实体框架。

我认为这可能与我的CodeFirstMySQLEntities类构造函数有关,但不确定。

如果有人能为我提供指导,我将不胜感激。

这是主代码:

namespace CodeFirstMySQL 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      UserRepository userRepository = new UserRepository(); 

      userRepository.Update("Klein", "OtherName"); 

      //delay experienced here 

      Console.WriteLine("done"); 
      Console.ReadLine(); 
     } 
    } 
} 

这是的DbContext代码:

namespace CodeFirstMySQL.Database 
{ 
    public class CodeFirstMySQLEntities : DbContext 
    { 
     public CodeFirstMySQLEntities() : base("CodeFirstMySQLEntities") { } 

     public DbSet<UserModel> Users { get; set; } 
    } 
} 

这是的usermodel代码:

namespace CodeFirstMySQL.Database.Models 
{ 
    public class UserModel 
    { 
     [Key, StringLength(100)] 
     public string firstName { get; set; } 

     [StringLength(100)] 
     public string lastName { get; set; } 
    } 
} 

这是存储库的代码:

namespace CodeFirstMySQL.Database.Repositories 
{ 
    public class UserRepository 
    { 
     public void Insert(UserModel user) 
     { 
      using (var context = new CodeFirstMySQLEntities()) 
      { 
       context.Users.Add(user); 
       context.SaveChanges(); 
      } 
     } 

     public void Delete(string firstName) 
     { 
      using (var context = new CodeFirstMySQLEntities()) 
      { 
       UserModel user = context.Users.FirstOrDefault(x => x.firstName == firstName); 
       context.Users.Remove(user); 
       context.SaveChanges(); 
      } 
     } 

     public void Update(string lastNameOld, string lastNameNew) 
     { 
      using (var context = new CodeFirstMySQLEntities()) 
      { 
       UserModel user = context.Users.FirstOrDefault(x => x.lastName == lastNameOld); 
       user.lastName = lastNameNew; 
       context.SaveChanges(); 
      } 
     } 

     public IList<UserModel> GetUsers() 
     { 
      using (var context = new CodeFirstMySQLEntities()) 
      { 
       return context.Set<UserModel>().ToList(); 
      } 
     } 
    } 
} 

连接字符串:

<connectionStrings> 
    <add name="CodeFirstMySQLEntities" connectionString="Server=localhost; Database=CodeFirst; Uid=root; Pwd=" providerName="MySql.Data.MySqlClient"/> 
    </connectionStrings> 
+0

您是否在本地调试到SQL Server的远程实例? – 2013-03-19 18:04:14

+0

不,你可以看到连接字符串指向'本地主机' – 2013-03-19 18:04:55

+0

啊,是的,看起来是正确的过去... – 2013-03-19 18:07:11

回答

6

延迟几乎可以肯定是由于时间的实体框架需要火起来。您可以通过在退出代码之前尝试第二次更新来确认这一点。

The following excerpt explains what is going on

模型缓存

有涉及在发现的模型,处理数据注解和施加流利API配置一些成本。为了避免每次派生DbContext被实例化时产生这种代价,模型在第一次初始化期间被缓存。每次在相同的AppDomain中构建相同的派生上下文时,缓存的模型将被重新使用。

+0

刚刚测试过,它实际上是真的。尽快接受你的回答。在真正的应用程序中,什么是“初始化”DbContext的最佳方式?只是一个随机请求? – 2013-03-19 18:14:39

+1

这很大程度上取决于它如何托管以及AppDomain的生命周期。我相信有一个IIS设置可以配置池以初始化自己,并在Windows服务(或任何Windows窗体应用程序)中启动它。 – qujck 2013-03-19 18:18:34