优雅地避免Oracle在EF6.0中的困扰
Entity Framework是微软推出的一款ORM(Object-Relation Mapping)框架,它为我们简化了与数据库打交道的工作,同时还提高了程序的可维护性和可扩展性。然而,在 use case 中,我们发现在使用EF6.0与Oracle数据库配合使用时,会遇到一些问题。这里分享一些解决方案,解决这个困扰。
1. 数据库驱动的选择
在使用EF6.0中的Oracle数据库时,我们需要安装Oracle.DataAccess和EntityFramework两个NuGet包。由于Oracle.DataAccess为微软的驱动不提供支持,因此我们需要使用Oracle官方的ODP.NET驱动。使用Oracle官方驱动,不仅可以避免一些兼容性问题,还具有更好的性能。
2. 避免数据读取中的 string 到 clob 的转换
在EF6.0中,默认会将string映射到clob类型。这会对性能产生影响。此问题可以通过在ObjectContext派生类的构造函数中进行以下设置来解决:
this.Configuration.AutoDetectChangesEnabled = true;
this.Configuration.ValidateOnSaveEnabled = true;
this.Configuration.LazyLoadingEnabled = true;
this.Configuration.ProxyCreationEnabled = true;
this.Configuration.UseDatabaseNullSemantics = false;
this.Configuration.UseOptimisticConcurrency = false;
this.Configuration.EnsureTransactionsForFunctionsAndCommands = false;
this.Configuration.UseDatabaseNullSemantics = false;
this.Configuration.UseTransactionForSelectStatements = false;
this.Configuration.ValidateOnSaveEnabled = true;
3. 显示调用 ToList()
默认情况下,EF6.0不会执行任何查询,直到调用了ToList()或其他输出查询结果的方法。这可能会导致许多用户不知道查询何时实际执行,也因此错过了最佳的机会来优化查询。在Oracle数据库中,直接使用 IEnumerable 会导致EF崩溃。我们需要显示地调用ToList()方法来获得查询结果。
4. 关闭数据库会话
如果EF不在架构中使用,则不关闭连接。在Oracle中,一个连接的数量有限,如果不及时释放它,将会占用所有连接。此问题可以通过确保尽快关闭数据库会话来解决。在ObjectContext派生类的Dispose()方法中添加以下代码即可:
protected override void Dispose(bool disposing)
{
if (disposing)
{
if (Connection.State == ConnectionState.Open)
{
Connection.Close();
}
}
base.Dispose(disposing);
}
在使用Oracle数据库时,遵循这些关键点和技巧可以帮助你优雅地避免EF6.0中的困扰。