.NET Framework 4 - 对数据库的第一次 Entity Framework 调用从未在控制台应用程序中完成
.NET Framework 4 - First Entity Framework call to database never completes in console application
所以我有两个应用程序,一个 ASP.NET Web 窗体应用程序(相同的框架)和一个利用业务逻辑库的控制台应用程序(相同的框架)。在 Web 窗体应用程序上,就性能而言,一切 运行 都很棒。在控制台应用程序上,它在第一次 entity framework 调用 SQL 服务器实例时挂起。
来自用户 class 的是 DbSet 使用的 table 的各种属性:
public static List<User> GetUsersWithPrefixesOrProdLines()
{
LegacyContext db = new LegacyContext();
var records = db.Users.Where(c => !String.IsNullOrEmpty(c.Proto_Prefixes) || !String.IsNullOrEmpty(c.Product_Lines)).ToList(); // hangs here
return records;
}
这个table没什么特别的。 8列数据大约有50条记录。我可以非常快地从 WebForms 应用程序 运行 执行此操作。不幸的是,控制台应用程序已经 运行ning 了 10 分钟,它还没有吐出
的结果
List<User> users = User.GetUsersWithPrefixesOrProdLines();
Console.WriteLine("Users Count: " + users.Count());
听起来像是数据库连接问题。我会检查控制台 app.config 中的连接字符串(以及生成的 .exe.config 文件),这取决于您使用的数据库和身份验证模式。 (即 SQL 服务器帐户或集成等)例如,如果您的连接字符串使用集成模式,则用于网站应用程序池的 windows 帐户可能可以访问数据库,而帐户 运行宁控制台应用程序没有。如果控制台应用程序 运行 自动像调度程序一样,请查看它 运行 的用户帐户。
关于使用 EF DbContexts 的一个重要细节是它们应该始终在使用时被释放:
public static List<User> GetUsersWithPrefixesOrProdLines()
{
using (LegacyContext db = new LegacyContext())
{
var records = db.Users
.Where(c => !String.IsNullOrEmpty(c.Proto_Prefixes)
|| !String.IsNullOrEmpty(c.Product_Lines))
.ToList();
return records;
}
}
让 DbContexts 打开会导致内存泄漏和其他潜在问题。如果您的代码依赖于此方法范围之外的延迟加载,则处理 DbContext /w a using
块可能会导致意外错误。 (即用户引用其他实体,并且此方法的调用者访问这些导航属性)使用未处置的 DbContext 时,延迟加载调用将起作用,但处置 DbContext 以释放它会导致这些失败。立即加载相关实体或将 DbContext 的范围移到此方法之外。 (即模块级别,而不是静态方法或将 DbContext 作为参数传递到方法中)您可以检查 运行 时间实际使用的连接字符串:
var connectionString = db.Database.Connection.ConnectionString; // assuming EF6
所以我有两个应用程序,一个 ASP.NET Web 窗体应用程序(相同的框架)和一个利用业务逻辑库的控制台应用程序(相同的框架)。在 Web 窗体应用程序上,就性能而言,一切 运行 都很棒。在控制台应用程序上,它在第一次 entity framework 调用 SQL 服务器实例时挂起。
来自用户 class 的是 DbSet 使用的 table 的各种属性:
public static List<User> GetUsersWithPrefixesOrProdLines()
{
LegacyContext db = new LegacyContext();
var records = db.Users.Where(c => !String.IsNullOrEmpty(c.Proto_Prefixes) || !String.IsNullOrEmpty(c.Product_Lines)).ToList(); // hangs here
return records;
}
这个table没什么特别的。 8列数据大约有50条记录。我可以非常快地从 WebForms 应用程序 运行 执行此操作。不幸的是,控制台应用程序已经 运行ning 了 10 分钟,它还没有吐出
的结果 List<User> users = User.GetUsersWithPrefixesOrProdLines();
Console.WriteLine("Users Count: " + users.Count());
听起来像是数据库连接问题。我会检查控制台 app.config 中的连接字符串(以及生成的 .exe.config 文件),这取决于您使用的数据库和身份验证模式。 (即 SQL 服务器帐户或集成等)例如,如果您的连接字符串使用集成模式,则用于网站应用程序池的 windows 帐户可能可以访问数据库,而帐户 运行宁控制台应用程序没有。如果控制台应用程序 运行 自动像调度程序一样,请查看它 运行 的用户帐户。
关于使用 EF DbContexts 的一个重要细节是它们应该始终在使用时被释放:
public static List<User> GetUsersWithPrefixesOrProdLines()
{
using (LegacyContext db = new LegacyContext())
{
var records = db.Users
.Where(c => !String.IsNullOrEmpty(c.Proto_Prefixes)
|| !String.IsNullOrEmpty(c.Product_Lines))
.ToList();
return records;
}
}
让 DbContexts 打开会导致内存泄漏和其他潜在问题。如果您的代码依赖于此方法范围之外的延迟加载,则处理 DbContext /w a using
块可能会导致意外错误。 (即用户引用其他实体,并且此方法的调用者访问这些导航属性)使用未处置的 DbContext 时,延迟加载调用将起作用,但处置 DbContext 以释放它会导致这些失败。立即加载相关实体或将 DbContext 的范围移到此方法之外。 (即模块级别,而不是静态方法或将 DbContext 作为参数传递到方法中)您可以检查 运行 时间实际使用的连接字符串:
var connectionString = db.Database.Connection.ConnectionString; // assuming EF6