EF 必须要了解的一些 关键字含义
virtual 导航属性 属性注释与Fluent API iqueryable ienumable 延迟加载 (懒加载) include 贪婪加载 变量捕获
EF使用sql语句 以及使用存储过程
解释:
导航属性 其实就是 对表与表之间的关系进行说明 谁是谁的从表virtual 表示
属性注释和Fluent API 其实就是对字段之间的说明 谁不为空 谁是主键 谁长度多少
eg:
[Table("TimeZoneAirport")]
public class TimeZoneAirport
{
[Key]
public Int32 Id { get; set; }
[ForeignKey("TimeZone")]
public Int32 TimeZoneId { get; set; }
public virtual TimeZone TimeZone { get; set; } //说明了与imeZone表有关系 而且自己是从表因为有外键注释
[MaxLength(5)]
public String AirportCode { get; set; }
public Int32 Order { get; set; }
}
iqueryable 与 ienumable 类型 其实 个人理解就是 表达式类型 与 内存类型
延迟加载(懒加载) 其实就是运用了 iqueryable 延迟加载数据 以及(virtual去懒加载将数据带出来)
概念:延迟加载延迟在哪里,1:条件需求的拼接 (iqueryable 表达式树) 2:导航属性的内容(virtual导航属性)poco=>proxy 默认代理和延迟都是开启
详解:1.针对外键导航属性,EF只有在这个外键属性用到的时候才会去查询2.先拼接出表达条件后放在那等条件完毕后tolist就能交互一次数据库
贪婪加载就是 在循环的时候 如果有延迟加载的话 那么效率就会低因为延迟加载带出来的数据也在循环里面 每次循环都会去查一下导航数据 所以就会重复多次 影响效率,所以include 的话 作用就是一次性加载出来 就算循环里面用到导航数据 也是从内存里面读取 而不用去和数据库一直交互从而提高效率
贪婪加载注意要关闭延迟加载
context.Configuration.LazyLoadingEnabled = false;
变量捕获 举例去掉元音字符
IEnumerable<char> query = "How are you, friend.";
foreach(char vowel in "aeiou")
{query = query.Where(c => c != vowel);}
//只更改了u 是因为变量名一样 where(!vowel).where(!vowel)最后只取u
foreach (char c in query) Console.Write(c); //How are yo, friend.
IEnumerable<char> query = "How are you, friend.";
foreach (char vowel in "aeiou")
{
char temp = vowel;
query = query.Where(c => c != temp);
}
//因为变量名不一样所以 where(!a).where(!b)都加上了
foreach (char c in query) Console.Write(c); //Hw r y, frnd.