这几天搞明白一个问题Include 的使用方法、使用场景,之所以名字使用之前的标题,是因为我不想再写一遍类关系图,想看类关系图的请看第一篇文章,
先说一个其它问题:this.Configuration.LazyLoadingEnabled = false;(把它放在DBContext构造函数中),这句话干嘛的?如果没有这句话,EF会加载查询类中【所有】的关系表到内存中,导致速度会受影响,所以我们先要切断类和类之间的联系,切断之后我们可以通用Include 的方法再把它们连接起来,达到我们查询多表的目地,及提高了速度又不影响我们的业务使用。
//加载KeyMain下的KeyType类 var a=await db.KeyMains.Include(k => k.KeyType).ToListAsync(); //加载KeyType下的KeyMain类 var b = await db.KeyTypes .Include(k => k.KeyMains).ToListAsync(); //加载KeyTypes 下的KeyMains下的KeyMainOne类 var c = await db.KeyTypes .Include(k => k.KeyMains.Select(km => km.KeyMainOne)).ToListAsync();
如果是一对一对一关系直接点就可以,如果是一对多对多就要使用Select方法
2017.12.6 之后使用CodeFrist出现一个循环引用问题.
{
"Message": "出现错误。",
"ExceptionMessage": "“ObjectContent`1”类型未能序列化内容类型“application/json; charset=utf-8”的响应正文。",
"ExceptionType": "System.InvalidOperationException",
"StackTrace": null,
"InnerException": {
"Message": "出现错误。",
"ExceptionMessage": "Self referencing loop detected for property 'RightScope' with type 'DIH.Settings.DAL.Model.RightScope'. Path '[0].RightItems[0]'.",
"ExceptionType": "Newtonsoft.Json.JsonSerializationException",
解决方法是在WebApiConfig.cs中加入:
//Ignore referenceloophandling for json.net
config.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;