.net core EF 实体加载模式
数据加载有三种方式 1 预加载 2显示加载 3 延迟加载 也叫懒加载
1预加载
直接从数据库中查出关联数据,这种方式用起来方便,但是会加载一些不需要的数据
主要用 Include() 方法 ThenInclude() 方法
1 /// <summary> 2 /// 获取评论和评论的用户 3 /// </summary> 4 /// <param name="id"></param> 5 /// <param name="cancellationToken"></param> 6 /// <returns></returns> 7 public async Task<Article> GetByIdAsync(int id, CancellationToken cancellationToken = default) 8 { 9 return await DbContext().Articles.Where(item => item.Id == id)
.Include(item => item.ArticleComments)
.ThenInclude(item => item.CreateUser).SingleOrDefaultAsync(); 10 }
2显示加载
通过DBContext().Entry()显示调用加载数据对于集合类型使用Collection方法对于单个实体使用 Reference()方法
1 Article article = DbContext().Articles.FirstOrDefault(item => item.Id == id);
2 //查询实体 与另外一个实体的Collection集合关联关系
3 await DbContext().Entry<Article>(article).Collection(item => item.ArticleComments).LoadAsync();
4 //查询实体 与另外一个单独实体的关联
5 await DbContext().Entry<Article>(article).Reference(item => item.CreateUser).LoadAsync();
3延迟加载
表示在访问导航属性时候,加载数据
EF默认没有支持延迟加载需要Nuget下载
Microsoft.EntityFrameworkCore.Proxies
两种使用方式
1可以在Service注入方式时候使用
1 #region 添加sql
2 builder.Services.AddDbContext<BBSContext>(options =>
3 {
4 options.UseLazyLoadingProxies().UseSqlServer(builder.Configuration.GetConnectionString("con"));
5 });
6 #endregion
2可以在DBContext下使用
1 protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
2 {
3 optionsBuilder.UseLazyLoadingProxies().UseSqlServer("server=.;database=bbs;uid=sa;pwd=");
4 }
使用懒加载 实体类属性需要 用 virtual 来标记 为导航属性例如下面的实体类
1 /// <summary> 2 /// 文章 3 /// </summary> 4 public class Article : RootEntityTkey<int> 5 { 6 /// <summary> 7 /// 标题 8 /// </summary> 9 [DisplayName("标题")] 10 public string Title { get; set; } 11 /// <summary> 12 /// 封面 13 /// </summary> 14 [DisplayName("封面")] 15 public string Cover { get; set; } 16 /// <summary> 17 /// 内容 18 /// </summary> 19 [DisplayName("内容")] 20 public string Content { get; set; } 21 /// <summary> 22 /// 类别 23 /// </summary> 24 [DisplayName("类别")] 25 public string Tag { get; set; } 26 /// <summary> 27 /// 访问量 28 /// </summary> 29 [DisplayName("访问量")] 30 public int Traffic { get; set; } 31 /// <summary> 32 /// 创建时间 33 /// </summary> 34 [DisplayName("创建时间")] 35 public DateTime CreateTime { get; set; } 36 /// <summary> 37 /// 创建用户 38 /// </summary> 39 [DisplayName("创建用户")] 40 public int CreateUserId { get; set; } 41 /// <summary> 42 /// 创建用户 43 /// </summary> 44 public virtual UserInfo CreateUser { get; set; } 45 /// <summary> 46 /// 收藏文章的用户 47 /// </summary> 48 public virtual ICollection<UserCollectionArticle> CollectionArticles { get; set; } = new List<UserCollectionArticle>(); 49 /// <summary> 50 /// 文章评论 51 /// </summary> 52 public virtual ICollection<ArticleComment> ArticleComments { get; set; } = new List<ArticleComment>(); 53 }