本文介绍一些改善EF代码、优化其性能的相关方法,如NoTracking,GetObjectByKey, Include等 ,还包括编译查询、存储模型视图以及冲突处理等内容。 。
当我们只需要读取某些数据而不需要删除、更新的时候,可以指定使用MergeOption.NoTracking的方式来执行只读查询(EF默认的方式是AppendOnly)。当指定使用NoTracking来进行只读查询时,与实体相关的引用实体不会被返回,它们会被自动设置为null。因此,使用NoTracking可以提升查询的性能。示例代码如下:
}
GetObjectByKey
:
在EF中,使用GetObjectByKey方法获取数据时,它首先会查询是否有缓存,如果有缓存则从缓存中返回需要的实体。如果没有则查询数据库,返回需要的实体,并添加在缓存中以便下次使用。
First:
总从数据库中提取需要的实体。
因此,我们应在合适的地方选择GetObjectByKey方法来获取数据,以减少对数据库的访问提升性能。示例代码如下:
}
此外,需要注意的是如果
GetObjectByKey
没有获取到符合条件的数据,那么它会抛异常。为了避免此情况发生,在有可能出现异常的地方,我们应该使用
TryGetObjectByKey
方法。
TryGetObjectByKey
方法获取数据的方式和
GetObjectByKey
类似,只是当没有取到符合条件的数据时,
TryGetObjectByKey
会返回
null
而不是抛异常。示例代码如下:
}
First:
当我们使用First来获取数据,如果没有符合条件的数据,那么我们的代码将会抛出异常。
FirstOrDefault:
当我们使用
FirstOrDefault
来获取的数据,如果没有符合条件的数据,那么它将返回null。
显然,对于一个良好的代码,是对可以预见的异常进行处理,而不是等它自己抛出来。示例代码如下:
}
EF
不支持实体的部分属性延迟加载,但它支持实体关系的延迟加载。默认情况,实体的关系是不会加载。如下代码:
}
上述代码中,因为Orders没有被加载,所以在输出Orders的时候,是不会有任何输出的。
当我们需要加载某些关联的关系时,可是用
Include
方法,如下代码所示:
出处: http://www.cnblogs.com/xray2005