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(); } }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战