.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     }

 

posted on 2023-04-13 17:25  是水饺不是水饺  阅读(43)  评论(0)    收藏  举报

导航