【EF Core】使用外部 Model
【EF Core】使用外部 Model在实际的企业级开发中我们经常会遇到需要将数据模型Model从主项目中分离出来的场景。例如多个微服务共享同一个数据模型或者我们希望将模型定义放在独立的类库中以便于复用和维护。本文将从实战角度出发详细演示如何在 EF Core 中使用外部 Model并提供完整的代码示例。## 为什么需要外部 Model在传统的单体应用中Model 通常直接定义在同一个项目中。但随着项目规模的增长这种做法的弊端逐渐显现-耦合度高Model 与数据访问逻辑紧密绑定难以复用。-维护困难多个项目需要修改同一份 Model 时容易产生不一致。-团队协作受限不同团队可能负责不同的模块共享 Model 需要统一管理。将 Model 分离到独立的类库中可以解决上述问题。EF Core 完全支持这种架构只需通过 NuGet 包和引用配置即可实现。## 项目结构设计我们假设一个场景有两个项目MyApp.Models是独立的类库包含所有数据模型MyApp.Data是主项目负责数据库上下文和迁移。这种分离方式让模型可以被多个项目引用。项目结构如下MyApp/├── MyApp.Models/ (类库项目)│ ├── Models/│ │ └── User.cs│ └── MyApp.Models.csproj├── MyApp.Data/ (主项目)│ ├── Data/│ │ └── AppDbContext.cs│ ├── Migrations/│ ├── Program.cs│ └── MyApp.Data.csproj## 步骤1创建外部 Model 类库首先创建一个 .NET 类库项目并定义模型。文件MyApp.Models/Models/User.cscsharpusing System.ComponentModel.DataAnnotations;namespace MyApp.Models.Models{ // 用户实体类作为外部 Model public class User { [Key] // 主键标识 public int Id { get; set; } [Required] // 非空约束 [MaxLength(100)] // 最大长度 public string Name { get; set; } [EmailAddress] // 邮箱格式验证 public string Email { get; set; } public DateTime CreatedAt { get; set; } DateTime.UtcNow; // 默认值 }}这个模型定义在独立的类库中不依赖任何 EF Core 包。注意[Key]等特性来自System.ComponentModel.DataAnnotations这是 .NET 内置的因此无需额外引用 EF Core。## 步骤2主项目引用外部 Model在主项目MyApp.Data中通过 NuGet 或项目引用添加MyApp.Models依赖。假设两个项目在同一解决方案中可以直接添加项目引用。文件MyApp.Data.csprojxmlProject SdkMicrosoft.NET.Sdk PropertyGroup OutputTypeExe/OutputType TargetFrameworknet8.0/TargetFramework /PropertyGroup ItemGroup PackageReference IncludeMicrosoft.EntityFrameworkCore.SqlServer Version8.0.0 / PackageReference IncludeMicrosoft.EntityFrameworkCore.Tools Version8.0.0 / /ItemGroup !-- 引用外部 Model 类库 -- ItemGroup ProjectReference Include..\MyApp.Models\MyApp.Models.csproj / /ItemGroup/Project## 步骤3配置 DbContext 并注册外部 Model在 DbContext 中通过DbSetT属性暴露外部模型。关键在于EF Core 会自动扫描程序集只要模型被引用即可。文件MyApp.Data/Data/AppDbContext.cscsharpusing Microsoft.EntityFrameworkCore;using MyApp.Models.Models; // 引入外部模型命名空间namespace MyApp.Data.Data{ // 数据库上下文使用外部 Model public class AppDbContext : DbContext { public AppDbContext(DbContextOptionsAppDbContext options) : base(options) { } // 对外暴露 User 实体类型来自外部类库 public DbSetUser Users { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); // 可选对模型进行 Fluent API 配置 modelBuilder.EntityUser(entity { entity.ToTable(Users); // 指定表名 entity.Property(u u.Email).HasMaxLength(200); // 覆盖 DataAnnotation }); } }}注意这里不需要在OnModelCreating中手动注册每个实体EF Core 会自动发现DbSet中引用的类型。但如果模型在其他程序集且未通过DbSet暴露则需要使用modelBuilder.ApplyConfigurationsFromAssembly()或显式注册。## 步骤4配置连接字符串和迁移在主项目的Program.cs中配置连接字符串并执行迁移。文件MyApp.Data/Program.cscsharpusing Microsoft.EntityFrameworkCore;using Microsoft.Extensions.DependencyInjection;using MyApp.Data.Data;class Program{ static void Main(string[] args) { var serviceProvider new ServiceCollection() .AddDbContextAppDbContext(options options.UseSqlServer(Server(localdb)\\mssqllocaldb;DatabaseMyAppDb;Trusted_ConnectionTrue;)) .BuildServiceProvider(); // 使用数据库上下文 using (var context serviceProvider.GetRequiredServiceAppDbContext()) { // 确保数据库已创建开发环境使用 context.Database.EnsureCreated(); // 插入一条数据 var user new User { Name 张三, Email zhangsanexample.com }; context.Users.Add(user); context.SaveChanges(); // 查询数据 var users context.Users.ToList(); foreach (var u in users) { Console.WriteLine($ID: {u.Id}, Name: {u.Name}, Email: {u.Email}); } } }}运行此程序EF Core 会自动创建数据库和Users表并插入一条记录。## 完整代码运行示例为了验证一切正常下面提供一个更完整的示例包含迁移操作。### 步骤1安装 EF Core 工具在MyApp.Data项目目录下执行bashdotnet add package Microsoft.EntityFrameworkCore.Designdotnet tool install --global dotnet-ef### 步骤2创建迁移bashdotnet ef migrations add InitialCreate这会在MyApp.Data项目中生成迁移文件其中会引用MyApp.Models中的User类。### 步骤3更新数据库bashdotnet ef database update生成的 SQL 脚本会包含外部模型的表定义。## 高级技巧多程序集扫描如果外部 Model 分布在多个类库中可以通过程序集扫描自动注册所有实体。修改 AppDbContext.cscsharpprotected override void OnModelCreating(ModelBuilder modelBuilder){ // 扫描外部程序集中的所有实体 modelBuilder.ApplyConfigurationsFromAssembly(typeof(User).Assembly); // 或者扫描多个程序集 // var assemblies new[] { typeof(User).Assembly, typeof(Product).Assembly }; // foreach (var assembly in assemblies) // { // modelBuilder.ApplyConfigurationsFromAssembly(assembly); // }}这种方式特别适合插件化架构或大型微服务项目。## 总结通过本文的实战演示我们了解了如何在 EF Core 中使用外部 Model。核心步骤包括1. 在独立类库中定义数据模型使用 DataAnnotations 或 Fluent API。2. 在主项目中引用该外部类库。3. 在 DbContext 中通过DbSetT暴露模型。4. 配置连接字符串并执行迁移。这种分离架构带来了显著优势模型可复用、降低耦合、便于团队协作。EF Core 对跨程序集的支持非常成熟无论是简单的项目引用还是复杂的多程序集扫描都能优雅应对。在实际项目中建议将模型层独立出来作为数据契约Data Contract从而提升系统的可维护性和扩展性。

相关新闻

计算机毕业设计之基于SpringBoot的城市出行服务

计算机毕业设计之基于SpringBoot的城市出行服务

由于移动应用技术的持续性的快速发展,现实生活中人们大多数都是通过移动手机、电脑等智能设备来完成生活中的事务。因此,许多的人工传统行业也开始与互联网结合,不再一味的依靠人工手动,努力打造半自动数字化甚至是全自动数字化模…

2026/7/30 14:57:09阅读更多 →
Python图像批处理实战:尺寸调整、格式转换与水印添加

Python图像批处理实战:尺寸调整、格式转换与水印添加

在图像处理项目中,经常会遇到需要批量处理多张图片的场景,比如调整尺寸、格式转换、添加水印等。本文将以一个实际的图像处理项目为例,完整讲解从需求分析到代码实现的整个流程,帮助读者掌握图像批处理的核心技术。1. 项目背景与需…

2026/7/30 14:57:09阅读更多 →
3分钟解锁IDM永久免费使用:开源激活脚本终极解决方案

3分钟解锁IDM永久免费使用:开源激活脚本终极解决方案

3分钟解锁IDM永久免费使用:开源激活脚本终极解决方案 【免费下载链接】IDM-Activation-Script IDM Activation & Trail Reset Script 项目地址: https://gitcode.com/gh_mirrors/id/IDM-Activation-Script 还在为Internet Download Manager的30天试用期烦…

2026/7/30 14:57:09阅读更多 →
六大展区全面扩容,2027赛逸展覆盖全产业链

六大展区全面扩容,2027赛逸展覆盖全产业链

2027亚洲消费电子展(赛逸展)六大核心展区架构完整保留,并对所有板块进行全方位扩容升级,资源大幅向机器人科技、低空智能装备、AI智能硬件、算力基础设施等国家战略性新兴赛道倾斜,实现消费电子全产业链无死角覆盖&…

2026/7/30 18:46:22阅读更多 →
国内主流云盘对比

国内主流云盘对比

一、百度网盘 ✅ **优点** 1. 全网资源生态最强,绝大多数分享资源都是百度链接; 2. 功能最全:在线解压、离线下载、相册AI分类、文档OCR、超长回收站(180天); 3. 全平台客户端完善,电视端、车机…

2026/7/30 18:46:22阅读更多 →
AI视频创作革命:Pixelle-Video五分钟打造你的专属短视频工厂

AI视频创作革命:Pixelle-Video五分钟打造你的专属短视频工厂

AI视频创作革命:Pixelle-Video五分钟打造你的专属短视频工厂 【免费下载链接】Pixelle-Video 🚀 AI 全自动短视频引擎 | AI Fully Automated Short Video Engine 项目地址: https://gitcode.com/GitHub_Trending/pi/Pixelle-Video 想象一下&#…

2026/7/30 18:46:22阅读更多 →
5分钟掌握本地Cookie导出:Get cookies.txt LOCALLY终极安全方案

5分钟掌握本地Cookie导出:Get cookies.txt LOCALLY终极安全方案

5分钟掌握本地Cookie导出:Get cookies.txt LOCALLY终极安全方案 【免费下载链接】Get-cookies.txt-LOCALLY Get cookies.txt, NEVER send information outside. 项目地址: https://gitcode.com/gh_mirrors/ge/Get-cookies.txt-LOCALLY 在Web开发和自动化测试…

2026/7/30 18:46:22阅读更多 →
Loop:终极免费开源Mac窗口管理工具,彻底告别桌面杂乱

Loop:终极免费开源Mac窗口管理工具,彻底告别桌面杂乱

Loop:终极免费开源Mac窗口管理工具,彻底告别桌面杂乱 【免费下载链接】Loop Window management made elegant. 项目地址: https://gitcode.com/GitHub_Trending/lo/Loop 你是否曾因为Mac上杂乱的窗口布局而效率低下?当浏览器、编辑器、…

2026/7/30 18:46:22阅读更多 →
按产品等级匹配PCB公差标准与图纸标准化标注方案

按产品等级匹配PCB公差标准与图纸标准化标注方案

一、PCB 公差等级划分标准,四大产品层级对应的公差阈值划分按照产品使用环境、电气精度要求、装配精度需求,将 PCB 划分为通用消费级、工业常规级、精密电子级、超高精度特种级四个层级,每个层级匹配固定的公差范围,杜绝全部电路套…

2026/7/30 18:44:21阅读更多 →
覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

🔹 工具基础介绍 OpenClaw 是开源生态中一款实用性较强的本地智能工具,凭借本地离线运行、可视化图形操作和任务自动化三大核心特性,赢得了众多用户的青睐。与普通在线对话AI工具不同,它属于能够直接操控本机软硬件的智能数字员工…

2026/7/30 15:03:16阅读更多 →
伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

所谓液压伺服阀体的精密激光焊接,是用激光束对阀座壳体(通常为不锈钢或铝合金)进行密封焊接,使阀体在21-35MPa的高压液压油或压缩气体中长期运行而不发生介质泄漏。液压伺服阀是高端液压系统的"大脑"。从航空航天飞行控…

2026/7/30 12:22:27阅读更多 →
D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否还在…

2026/7/30 15:13:02阅读更多 →
3分钟解锁iOS应用自由:TrollInstallerX让你的iPhone摆脱安装限制 [特殊字符]

3分钟解锁iOS应用自由:TrollInstallerX让你的iPhone摆脱安装限制 [特殊字符]

3分钟解锁iOS应用自由:TrollInstallerX让你的iPhone摆脱安装限制 🚀 【免费下载链接】TrollInstallerX A TrollStore installer for iOS 14.0 - 16.6.1 项目地址: https://gitcode.com/gh_mirrors/tr/TrollInstallerX 你是否曾经因为iOS系统的严格…

2026/7/30 0:00:58阅读更多 →
[GESP202606 四级] 扫雷

[GESP202606 四级] 扫雷

B4557 [GESP202606 四级] 扫雷 https://www.luogu.com.cn/problem/B4557 中国计算机学会(CCF)2026年6月C四级讲解——扫雷 https://www.bilibili.com/video/BV1MCMg6AEXR/ B4557 [GESP202606 四级] 扫雷 https://www.bilibili.com/video/BV1ZKTj6ZEVh/ 2…

2026/7/30 0:00:58阅读更多 →
Windows驱动存储终极清理工具:DriverStoreExplorer完全指南

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 您是否曾因Windows系统盘空间不足而烦恼?是否遇到过设…

2026/7/30 0:00:58阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/30 0:27:26阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/30 4:47:18阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/30 15:43:46阅读更多 →