(二)EFCore(CodeFirst建实体类)+数据仓库类
1:在nuget下载安装包
Microsoft.EntityFrameworkCore
Microsoft.EntityFrameworkCore.SqlServer
Microsoft.EntityFrameworkCore.Tools
Microsoft.Extensions.DependencyModel
2.创建PmsContext.cs类
(1)生成实体的原理,在OnModelCreating里面运用反射,先排除所有的系统程序集,nuget下载包
(2)给要映射成表的实体一个标记,让他继承一个类(BaseEntity),表示凡是继承了BaseEntity的子类都会被映射到数据库表
(3)如果一个实体,需要用sql将几个表的查询结果放到一个实体(只查询不更新操作),比如需要用FromSqlRaw这种查询的时候
modelBuilder.Entity<T2>().HasNoKey().ToView("T2");
3:控制台命令实现映射
(1)如果PmsContext.cs不在当前web下面下面,需要在OnConfiguring方法里面
optionsBuilder.UseSqlServer(connectionString, b => b.MigrationsAssembly("DbMs"));
然后将程序包管理器控制台(默认项目)切换到PmsContext.cs所在的项目
(2)生成映射表的辅助类命令
add-migration db1
(3)更新数据库命令
update-database
(4)如果删除了migrations里面的某个版本类
add-migration xxx一次,然后删除Up,Down方法里面的内容,也就是此次迁移不对数据库做任何修改
然后手动修改数据库字段,改成于当前实体里面的字段完全一致(相当于数据库里面的修改不是由实体自动生成,而是手动修改成与实体一致了)
然后执行一次update-database,因为Up,Down类里面的操作都被删掉了,所以当次操作不会对数据库有任何操作,
然后再次修改实体就add-migration一次,呢呀就能继续下一次update-database了,上一次删除migrations版本就不会在影响到数据库字段丢失了
4:PmsContext.cs底层基础类的创建
public class PmsContext : DbContext
{
//实现ef基础操作的DbSet类型的泛型方法,之后的所有ef的基础操作(增删查改)基本来自呢个方法
public override DbSet<TEntity> Set<TEntity>()
{
return base.Set<TEntity>();
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
string connectionString = "Data Source=PC-202103271034\\SQLEXPRESS;Initial Catalog=dmscqdb;Persist Security Info=True;User ID=sa;Password=123456;Connect Timeout=500;";
optionsBuilder.UseSqlServer(connectionString, b => b.MigrationsAssembly("DbMs"));//指定链接字符串,指定迁移类生成到哪个项目下面
base.OnConfiguring(optionsBuilder);
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
try
{
//排除所有系统程序集,nuget下载包
var compilationLibrary = DependencyContext.Default.CompileLibraries.Where(s => !s.Serviceable && s.Type != "package" && s.Type == "project");
foreach (var _compilation in compilationLibrary)
{
//加载指定类
AssemblyLoadContext.Default.LoadFromAssemblyName(new AssemblyName(_compilation.Name))
.GetTypes().Where(x =>
x.GetTypeInfo().BaseType != null&& x.BaseType == (typeof(BaseEntity))).ToList().ForEach(t =>//必须要有基类,并且实现了BaseEntity类的实体才会附加到ef上下文(才能调用ef里面的方法以及映射成数据库表)
{
modelBuilder.Entity(t);
});
}
//HasNoKey(设置没有主键)
//ToView("FromePro")不生成表
modelBuilder.Entity<T2>().HasNoKey().ToView("T2");//不会生成表,可以查询数据
base.OnModelCreating(modelBuilder);
}
catch (Exception ex)
{
}
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 提示词工程——AI应用必不可少的技术
· 地球OL攻略 —— 某应届生求职总结
· 字符编码:从基础到乱码解决
· SpringCloud带你走进微服务的世界