当前位置: 首页 > news >正文

.net 6 efcore一个model映射到多张表(非使用IEntityTypeConfiguration)

现在有两张表,结构一模一样,我又不想创建两个一模一样的model,就想一个model映射到两张表
在这里插入图片描述
废话不多说直接上代码

  1. 安装依赖包
    在这里插入图片描述
  2. 创建model
namespace oneModelMultiTable.Model
{public class Test{public int id { get; set; }public string name { get; set; }public string tablename { get; set; }}
}
  1. 创建DBContext
    我们需要使用tablename 动态指定表名,因此需要在DBContext中添加这个属性
namespace oneModelMultiTable
{public class DBHelper:DbContext{public DbSet<Test> testConfigs { get; set; }public string tablename { get; set; }public DBHelper(DbContextOptions<DBHelper> options):base(options){}protected override void OnModelCreating(ModelBuilder modelBuilder){modelBuilder.Entity<Test>(b =>{b.ToTable(tablename);b.HasKey(p => p.id);});base.OnModelCreating(modelBuilder);//modelBuilder.ApplyConfigurationsFromAssembly(this.GetType().Assembly);}}
}
  1. 创建DynamicModelCacheKeyFactory 继承IModelCacheKeyFactory
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
namespace oneModelMultiTable
{public class DynamicModelCacheKeyFactory : IModelCacheKeyFactory{public object Create(DbContext context, bool designTime){object p = context is DBHelper dynamicContext? (context.GetType(), dynamicContext.tablename): (object)context.GetType();return p;}}
}
  1. 依赖注入
builder.Services.AddDbContext<DBHelper>(options =>
{options.UseNpgsql(@"Host=192.168.214.133;Port=32222;Database=postgresdb;Username=postgresadmin;Password=admin123").ReplaceService<IModelCacheKeyFactory, DynamicModelCacheKeyFactory>();
});
  1. 创建controller
using Microsoft.AspNetCore.Mvc;
using oneModelMultiTable.Model;// For more information on enabling Web API for empty projects, visit https://go.microsoft.com/fwlink/?LinkID=397860namespace oneModelMultiTable.Controllers
{[Route("api/[controller]/[action]")][ApiController]public class TestController : ControllerBase{public readonly DBHelper dBHelper;public TestController(DBHelper _DBHelper){dBHelper = _DBHelper;}// GET: api/<TestController>[HttpGet]public List<Test> Get(string tablename){dBHelper.tablename = tablename;return dBHelper.testConfigs.ToList();}}
}

原理
你可能想通过ToTable()方法来更改表名,但是我们如何在OnModelCreating方法中更改表名呢?当EF构建模型时,它只运行OnModelCreating一次。

对于这个场景,我们需要通过使用IModelCacheKeyFactory来更改默认映射,它允许我们连接到模型缓存机制,以便EF可以根据其属性创建不同的模型。
EF使用IModelCacheKeyFactory为模型生成缓存键。

https://yanxiaodi.medium.com/mapping-the-model-to-multiple-tables-with-entityframework-core-b46bdeed8661

https://medium.com/@pawel.gerr/entity-framework-core-changing-database-schema-at-runtime-dcf1211768c6

https://github.com/xdqt/asp.net-core/tree/master/oneModelMultiTable

http://www.lryc.cn/news/110122.html

相关文章:

  • CISCO MDS 9148 SAN Switch 交换机命令配置方法:
  • 图的深度、广度优先探索(数据结构)
  • c语言小知识点
  • C++ - 模板分离编译
  • 如何把非1024的采样数放入aac编码器
  • linux安装nodejs和vue
  • spring整合mybatis
  • Spring指定bean在哪个应用加载
  • 二维网格划分 LRU缓存设计
  • C++中使用 sizeof 确定变量的长度
  • 我们的衣物收纳商品政策
  • 代码随想录算法训练营第25天| 第七章 回溯算法part02: leetcode 216、leetcode 17
  • WebAPI文档与自动化测试
  • netty架构
  • 拉普拉斯平滑算法
  • Java课题笔记~ IoC 控制反转
  • 【Spring】Spring中的设计模式
  • 【ChatGLM_02】LangChain知识库+Lora微调chatglm2-6b模型+提示词Prompt的使用原则
  • 构建未来移动应用:探索安卓、iOS和HarmonyOS的技术之旅
  • 【新版系统架构补充】-嵌入式软件
  • 【云原生】K8S超详细概述
  • (五)Node.js -模块的加载机制
  • 【docker】Windows11系统下安装并配置阿里云镜像加速
  • SpringBoot搭建WebSocket初始化
  • 节能延寿:ARM Cortex-M微控制器下的低功耗定时器应用
  • GPT突破限制回复图片
  • 微信小程序nodejs+vue+uniapp高校食堂线上预约点餐系统
  • Python 程序设计入门(006)—— 列表的操作(1):列表元素的增、删、改操作
  • 使用Python实现高效数据下采样:详解最大三角形三桶(LTTB)算法
  • 无涯教程-Perl - for 语句函数