(二)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)
{

}
}


}
}

posted @   yingxianqi  阅读(270)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 提示词工程——AI应用必不可少的技术
· 地球OL攻略 —— 某应届生求职总结
· 字符编码:从基础到乱码解决
· SpringCloud带你走进微服务的世界
点击右上角即可分享
微信分享提示