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

这篇具有很好参考价值的文章主要介绍了.net 6 efcore一个model映射到多张表(非使用IEntityTypeConfiguration)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

现在有两张表,结构一模一样,我又不想创建两个一模一样的model,就想一个model映射到两张表
.net 6 efcore一个model映射到多张表(非使用IEntityTypeConfiguration),.netCore,.net
废话不多说直接上代码

  1. 安装依赖包
    .net 6 efcore一个model映射到多张表(非使用IEntityTypeConfiguration),.netCore,.net
  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=397860

namespace 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文章来源地址https://www.toymoban.com/news/detail-625163.html

到了这里,关于.net 6 efcore一个model映射到多张表(非使用IEntityTypeConfiguration)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Net8 EFCore Mysql 连接

    一、安装插件 Pomelo.EntityFrameworkCore.MySq (这里要选8.0.0以上版本低版本不支持.net8) 二、配置数据库连接串  appsettings.json 中配置数据库连接串 三、添加实体类Student和数据库上下文 新建 Entities 目录,在,根据表及字段,在目录下新建 Student 实体类,在类上加  [Table(\\\"student\\\")] 表

    2024年02月22日
    浏览(46)
  • 【.NET_EFCore中常见错误汇总】

    记录一下在配置分层项目中所遇到的问题: 问题一:         启动项目没有引用:Your startup project \\\'8.1-MVC \\\' doesn\\\'t reference Microsoft.EntityFrameworkCore.Design. This package is required for the Entity Framework Core Tools to work. Ensure your startup project is correct, install the package, and try again.  解决方法:将

    2024年02月06日
    浏览(38)
  • 【C#/.NET】使用Automapper映射record类型

    ​         当使用Automapper进行对象映射时,通常我们会使用POCO(Plain Old CLR Object)类作为源对象和目标对象。然而,自从C# 9引入了record类型,它们提供了更简洁、不可变的对象模型。我已经将项目的所有Dto都是用record类型,但是record类型还是有些需要注意的点,本文将介

    2024年02月11日
    浏览(38)
  • asp.net core EFCore 属性配置与DbContext

    Entity Framework (EF) Core 是轻量化、可扩展、开源和跨平台版的常用 Entity Framework 数据访问技术。用于程序中的class类和数据库中的表互相之间建立映射关系。在学习过程中,EFCore中的属性配置显的尤为重要它是学习好asp.net core的基础是配置数据库表结构的重要基石。本篇内容为

    2024年02月07日
    浏览(58)
  • .NET ORM核心功能之导航属性- EFCore和 SqlSugar

    导航属性是作为.NET ORM核心功能中的核心,在SqlSugar没有支持导航属性前,都说只是一个高级DbHelper, 经过3年的SqlSugar重构已经拥有了一套 非常成熟的导航属性体系,本文不是重点讲SqlSugar而是重点讲导航属性的作用,让更多写Sql人还未使用ORM的人了解到ORM的作用。   用户根据

    2024年02月07日
    浏览(46)
  • .NET领域性能最好的对象映射框架Mapster使用方法

      Mapster是一个开源的.NET对象映射库,它提供了一种简单而强大的方式来处理对象之间的映射。在本文中,我将详细介绍如何在.NET中使用Mapster,并提供一些实例和源代码。 和其它框架性能对比:   Mapster的安装和配置: 首先,打开Visual Studio并创建一个新的.NET项目。 在NuGe

    2024年02月05日
    浏览(46)
  • ASP.NET Core 3.1系列(16)——EFCore之Code First

    前一篇博客介绍了 EFCore 中的 DB First 开发模式,该模式可以根据数据库生成实体类和数据库上下文,因此适用于数据库已经存在的场景。而与之相对应的, Code First 主要是根据自定义的实体类和数据库上下文反向构建数据库,因此也可以看做是 DB First 的逆过程,下面开始介绍

    2024年01月17日
    浏览(59)
  • ASP.NET Core 3.1系列(15)——EFCore之DB First

    本文开始介绍一些关于 Entity Framework Core 的内容。在 EFCore 中,常用的为 DB First 模式和 Code First 模式,下面就来介绍一下如何在 EFCore 中使用 DB First 模式生成实体类和数据库上下文。 在 SQL Server 中新建一个数据库 Dao ,执行如下语句,创建 Country 和 Province 数据表。 运行结果如

    2024年02月15日
    浏览(48)
  • asp.net core 6.0 efcore +sqlserver增删改查的demo

    下面是一个使用ASP.NET Core 5.0和Entity Framework Core进行增删改查操作的示例。 首先,创建一个空的ASP.NET Core 6.0 Web应用程序项目。 然后,安装以下NuGet包: Microsoft.EntityFrameworkCore.SqlServer Microsoft.EntityFrameworkCore.Tools 接下来,创建一个数据库上下文类,用于定义实体类和数据库连接

    2024年02月13日
    浏览(43)
  • ASP.Net Core Web Api+EFCore+MySql实现动态查询(保姆教学)

    本文会详细讲解如何从打开文件到第一个API开发完成,过程十分详细,是基于学习入门。 现在让我们开始吧! 打开VS(演示用的Visual Studio2022) 第一步我们选择创建新项目   第二步 选择开发语言以及应用程序 我们选择C# -所有平台-Web API.找到 ASP.NET Core Web API 应用   这里应用

    2024年02月12日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包