EF Core懶人小技巧之拒絕DbSet


前言

最近在項目中使用EF Core的頻率越來越高,當項目比較大的時候,瘋狂往DbContext中加各種DbSet,你會不會特難受?如果你是一鍵生成的大佬,那么請忽略本文。本文旨在不寫 DbSet,那么就擼起柚(xiu)子干吧...

正經事

1. 約定規則

首先,為了達到偷懶的目的,我們得事先約定些規則,畢竟無規矩不成方圓。具體規則可以自定義,比如我目前的規則就是在數據表對應的實體類加上些特有的Attribute,比如現成的DbContextAttribute,這個Attribute的具體作用請參考MSDN官方文檔。

 1 using Microsoft.EntityFrameworkCore.Infrastructure;
 2 using System;
 3 using System.ComponentModel.DataAnnotations;
 4 using System.ComponentModel.DataAnnotations.Schema;
 5 using Zxw.Framework.NetCore.DbContextCore;
 6 using Zxw.Framework.NetCore.Models;
 7 
 8 namespace Zxw.Framework.Website.Models
 9 {
10     [DbContext(typeof(SqlServerDbContext))]
11     [Table("SysMenu")]
12     public class SysMenu:BaseModel<string>
13     {
14         [Key]
15         [Column("SysMenuId")]
16         public override string Id { get; set; }
17 
18         public string ParentId { get; set; } = String.Empty;
19 
20         [MaxLength(2000)]
21         public string MenuPath { get; set; }
22 
23         [Required]
24         [MaxLength(20)]
25         public string MenuName { get; set; }
26 
27         [MaxLength(50)]
28         public string MenuIcon { get; set; }
29 
30         [Required]
31         [MaxLength(100)]
32         public string Identity { get; set; }
33 
34         [Required]
35         [MaxLength(200)]
36         public string RouteUrl { get; set; }
37 
38         public bool Visiable { get; set; } = true;
39 
40         public bool Activable { get; set; } = true;
41 
42         [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
43         public int SortIndex { get; set; }
44     }
45 }
View Code

OK,規則我們約定好了,下面進行下一步。

2. 重寫數據庫上下文的OnModelCreating方法

先上代碼為敬:

 1         protected override void OnModelCreating(ModelBuilder modelBuilder)
 2         {
 3             MappingEntityTypes(modelBuilder);
 4             base.OnModelCreating(modelBuilder);
 5         }
 6 
 7         private void MappingEntityTypes(ModelBuilder modelBuilder)
 8         {
 9             if (string.IsNullOrEmpty(Option.ModelAssemblyName))
10                 return;
11             var assembly = Assembly.Load(Option.ModelAssemblyName);
12             var types = assembly?.GetTypes().Where(c=>c.GetCustomAttributes<DbContextAttribute>().Any());
13             var list = types?.Where(t =>
14                 t.IsClass && !t.IsGenericType && !t.IsAbstract &&
15                 t.GetInterfaces().Any(m =>
16                     m.IsAssignableFrom(typeof(BaseModel<>)) || m.IsAssignableFrom(typeof(BaseViewModel)))).ToList();
17             if (list != null && list.Any())
18             {
19                 list.ForEach(t =>
20                 {
21                     var dbContextType = t.GetCustomAttributes<DbContextAttribute>().FirstOrDefault(x=>x.ContextType==GetType());
22                     if (modelBuilder.Model.FindEntityType(t) == null && null!=dbContextType)
23                         modelBuilder.Model.AddEntityType(t);
24                 });
25             }
26         }
View Code

到此,或許已經明白,重要的只有一句:只要在 ModelBuilder.Model 中注冊我們的數據表實體類就可以代替萬千DbSet了

結束語

本次分享就到此結束,不妨親自試試。以上代碼可以在我的個人開源項目 【Zxw.Framework.NetCore】中找到,如果本項目對您有幫助,請給個star或者支持下自家土蜂蜜吧,也誠摯歡迎各路大佬提出建議以及批評指正。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM