首页 > 数据库 >dotnet efcore 多数据库 使用

dotnet efcore 多数据库 使用

时间:2024-01-20 11:45:10浏览次数:24  
标签:MultiDb get 数据库 System efcore new dotnet using public

ef core 的使用

依赖包

efcore-multi-db/MultiDb.Two/MultiDb.Two.csproj

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net7.0</TargetFramework>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Microsoft.Data.Sqlite.Core" Version="7.0.3" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="7.0.3" />
    <PackageReference Include="microsoft.entityframeworkcore.sqlserver" Version="7.0.15" />
    <PackageReference Include="microsoft.entityframeworkcore.tools" Version="7.0.15" />
  </ItemGroup>
</Project>

数据库上下文配置文件

efcore-multi-db/MultiDb.Two/DbTwoContext.cs

using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Text;

namespace MultiDb.Two
{
    public class DbTwoContext : DbContext
    {
        public DbSet<User> Users { get; set; }
        public DbSet<UserLecture> UserLectures { get; set; }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            if (!optionsBuilder.IsConfigured)
            {
                //不同的数据库,只需要修改此处的连接字符串即可
                // optionsBuilder.UseSqlServer(@"Server=(localdb)\ProjectsV13;Database=DbTwo;Integrated Security=True;MultipleActiveResultSets=True;");
                optionsBuilder.UseSqlite(@"Data Source=DbTwo.db");
            }
        }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<User>().ToTable("User");
            modelBuilder.Entity<UserLecture>().ToTable("UserLecture");
        }
    }
}

数据库实体

efcore-multi-db/MultiDb.Two/User.cs

using System;
using System.Collections.Generic;
using System.Text;

namespace MultiDb.Two
{
    public class User
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }
}

> `efcore-multi-db/MultiDb.Two/UserLecture.cs`

```cs
using System;
using System.Collections.Generic;
using System.Text;

namespace MultiDb.Two
{
    public class UserLecture
    {
        public int Id { get; set; }
        public int UserId { get; set; }
        public int LectureId { get; set; }

        public User User { get; set; }
    }
}

数据库2和数据库1项目结构类似

efcore-multi-db/MultiDb.One/MultiDb.One.csproj

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net7.0</TargetFramework>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Microsoft.Data.Sqlite.Core" Version="7.0.3" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="7.0.3" />
    <PackageReference Include="microsoft.entityframeworkcore.sqlserver" Version="7.0.15" />
    <PackageReference Include="microsoft.entityframeworkcore.tools" Version="7.0.15" />
  </ItemGroup>
</Project>

efcore-multi-db/MultiDb.One/Lecture.cs

using System;
using System.Collections.Generic;
using System.Text;

namespace MultiDb.One
{
    public class Lecture
    {
        public int Id { get; set; }
        public int UserId { get; set; }
        public string Name { get; set; }
    }
}

efcore-multi-db/MultiDb.One/DbOneContext.cs

using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Text;

namespace MultiDb.One
{
    public class DbOneContext : DbContext
    {
        public DbSet<Lecture> Lectures { get; set; }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            if (!optionsBuilder.IsConfigured)
            {
                // optionsBuilder.UseSqlServer(@"Server=(localdb)\ProjectsV13;Database=DbOne;Integrated Security=True;MultipleActiveResultSets=True;");
                optionsBuilder.UseSqlite(@"Data Source=DbOne.db");
            }
        }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Lecture>().ToTable("Lecture");
        }
    }
}

主程序

添加两个子项目的引用

efcore-multi-db/MultiDb.App/MultiDb.App.csproj

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net7.0</TargetFramework>
  </PropertyGroup>
  <ItemGroup>
    <ProjectReference Include="..\MultiDb.One\MultiDb.One.csproj" />
    <ProjectReference Include="..\MultiDb.Two\MultiDb.Two.csproj" />
  </ItemGroup>
</Project>

创建model

model > entity,model的范围要大于entity,包含了数据表之间的关系,如果没有关系,两者差不多,比如下UserModel表示就是User和UserLecture之间的一对多关系.

efcore-multi-db/MultiDb.App/UserModel.cs

using System;
using System.Collections.Generic;
using System.Text;

namespace MultiDb.App
{
    public class UserModel
    {
        public int id { get; set; }
        public string name { get; set; }

        public List<LectureModel> lectures { get; set; }
    }
}

efcore-multi-db/MultiDb.App/DbInitializer.cs

using MultiDb.One;
using MultiDb.Two;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace MultiDb.App
{
    public static class DbInitializer
    {
        public static void Initialize(DbOneContext db1, DbTwoContext db2)
        {            
            db1.Database.EnsureCreated();
            db2.Database.EnsureCreated();

            if (!db2.Users.Any() && !db1.Lectures.Any())
            {
                var users = new User[]
                {
                    new User { Name = "User A" },
                    new User { Name = "User B" },
                    new User { Name = "User C" }
                };

                db2.Users.AddRange(users);
                db2.SaveChanges();

                var lectures = new Lecture[]
                {
                    new Lecture { Name = "Lecture A", UserId = 1 },
                    new Lecture { Name = "Lecture B", UserId = 2 },
                    new Lecture { Name = "Lecture C", UserId = 3 }
                };

                db1.Lectures.AddRange(lectures);
                db1.SaveChanges();

                var userLectures = new UserLecture[]
                {
                    new UserLecture { LectureId = 1, UserId = 2 },
                    new UserLecture { LectureId = 1, UserId = 3 },
                    new UserLecture { LectureId = 2, UserId = 1 },
                    new UserLecture { LectureId = 2, UserId = 3 },
                    new UserLecture { LectureId = 3, UserId = 1 },
                    new UserLecture { LectureId = 3, UserId = 2 }
                };

                db2.UserLectures.AddRange(userLectures);
                db2.SaveChanges();
            }
        }
    }
}

efcore-multi-db/MultiDb.App/LectureModel.cs

using System;
using System.Collections.Generic;
using System.Text;

namespace MultiDb.App
{
    public class LectureModel
    {
        public int id { get; set; }
        public string name { get; set; }
        public UserModel proctor { get; set; }

        public List<UserModel> attendees { get; set; }
    }
}

efcore-multi-db/MultiDb.App/DataExtensions.cs

using MultiDb.One;
using MultiDb.Two;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace MultiDb.App
{
    public static class DataExtensions
    {
        public static List<LectureModel> GetLectures(this DbOneContext db1, DbTwoContext db2)
        {
            var model = db1.Lectures.Select(x => new LectureModel
            {
                id = x.Id,
                name = x.Name,
                proctor = db2.GetUser(x.UserId),
                attendees = db2.GetAttendees(x.Id)
            }).OrderBy(x => x.name).ToList();

            return model;
        }

        public static UserModel GetUser(this DbTwoContext db2, int id)
        {
            var user = db2.Users.Find(id);

            return new UserModel
            {
                id = user.Id,
                name = user.Name
            };
        }

        public static List<UserModel> GetAttendees(this DbTwoContext db2, int id)
        {
            var model = db2.UserLectures.Where(x => x.LectureId == id).Select(x => new UserModel
            {
                id = x.UserId,
                name = x.User.Name
            }).OrderBy(x => x.name).ToList();

            return model;
        }
    }
}

efcore-multi-db/MultiDb.App/Program.cs

using MultiDb.One;
using MultiDb.Two;
using System;

using (var db1 = new DbOneContext())
{
    using (var db2 = new DbTwoContext())
    {
        DbInitializer.Initialize(db1, db2);

        var lectures = db1.GetLectures(db2);

        foreach (var l in lectures)
        {
            Console.WriteLine(l.name);
        }
        Console.ReadLine();
    }
}

标签:MultiDb,get,数据库,System,efcore,new,dotnet,using,public
From: https://www.cnblogs.com/zhuoss/p/17976213

相关文章

  • oracle数据库检测
    连接数--数据库连接数selectcount(*)fromv$process;--数据库允许的最大连接数selectvaluefromv$parameterwherename='processes';--session连接数selectcount(*)fromv$session;--并发连接数selectcount(*)fromv$sessionwherestatus='ACTIVE';表空......
  • Jmeter之配置数据库连接
    一前言环境Jmeter5.3window10下面介绍如何在Jmeter中查询mysql数据库二mysql数据库查询要查询mysql数据库,需要用到两个Jmeter组件,配置原件中的JDBCConnectionConfiguration和请求中的JDBCRequestJDBCConnectionConfiguration的作用是根据相关配置创建一个数据库连......
  • 自动化复习巩固第五天封装数据库及断言方法
     方法1:处理数据库方法说明:数据库配置文件,主要存放数据库连接信息settings.py文件mysql_info={  "host":"xxxxx",  "user":"xxxxx",  "password":"xxxxx",  "port":3306,  "charset":"utf8mb4&......
  • SQL Server 清除一个数据库下所有表数据,保留表结构
    用法:在需要清空数据的数据库创建并执行存储过程,该存储过程并不会影响其他数据库❗请小心使用这些脚本,确保在生产环境之前备份您的数据库。⚠️存储过程:CREATEPROCEDUREClearAllTablesASBEGINDECLARE@TableNameNVARCHAR(255)DECLAREtableCursorCURSORFOR......
  • HHDESK端口转发监控服务获取客户端和数据库之间的交互信息
    1.用户痛点端口转发是一种网络技术,用于将外部网络请求转发到内部网络中的特定设备或服务。它允许通过公共网络访问内部网络中的资源,提供了灵活性和便利性。传统的端口转发方式是通过配置路由器的端口映射,但这需要具备网络知识和一定的技术操作,对于一般用户来说较为繁琐。而HHDESK......
  • dotnet 8项目Docker部署报错 Unhandled exception. Microsoft.Data.SqlClient.SqlExce
    环境:dotnet8+sqlserver2012本地开发调试正常,部署至Docker容器时,运行实例报错。查看日志显示:Unhandledexception.Microsoft.Data.SqlClient.SqlException(0x80131904):Aconnectionwassuccessfullyestablishedwiththeserver,butthenanerroroccurredduringth......
  • C++ Qt开发:Charts与数据库组件联动
    Qt是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍Charts组件与QSql数据库组件的常用方法及灵活运用。在之前的文章中详细介绍了关于QCharts绘图组件......
  • Jmeter、postman、python 三大主流技术如何操作数据库?
    1、前言只要是做测试工作的,必然会接触到数据库,数据库在工作中的主要应用场景包括但不限于以下:功能测试中,涉及数据展示功能,需查库校验数据正确及完整性;例如商品搜索功能自动化测试或性能测试中,某些接口要跑通,需要关联到数据库操作;例如注册接口中短信验证码获取自动化测试中......
  • 用 CloudCanal 做跨互联网数据库双向同步
    简介CloudCanal推出跨互联网安全数据同步方案之后,有一些商业客户落地,效果良好,不过客户也反馈了一些改进和新需求,其中最大的一个需求即双向同步防循环。近期CloudCanal版本支持了这个特性,整体方案进一步升级,最大特点包括:两端数据库完全不开放公网端口两端数据库可双向同......
  • 阿里云rds云数据恢复至自建数据库 (linux 服务器版本ubuntu22.04)
    一、准备1.安装mysql5.7注意:需要跟rds云数据库版本对应2.安装PerconaXtraBackup工具,将解压后的备份文件恢复到自建数据库的数据目录中3.下载需要还原的物理备份文件我的是.qp类型wget-c'https://****.bak.rds.aliyuncs.com/****_xb.qp?****'-Oins2......