EF Core – Library use EF
前言
写 Library 有时候会用到 database, 会想用 EF 来维护.
比如 Identity, IdentityServer, OpenIddict, 这些 Library 都有使用到 EF.
虽然大家都用 EF, 但它们使用的手法都不太一样哦.
这篇就来研究一下, 写 Library 的时候怎么去使用 EF.
主要参考
相关 Class Library EF Core 的文章
.NET Core — Using Entity Framework Core in a separate Project
Design-time DbContext Creation
A library to run your business logic when using Entity Framework Core
Using EF Core in a Separate Class Library
Using EF Core in a Separate Class Library project
4 种手法
不要问我为什么有这么多 pattern. 我也想知道.
继承方式
Identity 的做法是用继承, ApplicationDbContext 继承 IdentityDbContext
我不太欣赏这种方式 (就不多介绍了). 但是不只 identity 这样用哦, 有些 library 也是用这个方式

多个 DbContext
IdentityServer 用的方式是多个 DbContext, 出来的 Migrations folder 长这样

我觉得这个方案挺不错的, 分得很开.
首先, Library 定义好 LibraryDbContext, Entity 等
然后 Application startup,cs
var assemblyName = typeof(Program).GetTypeInfo().Assembly.GetName().Name;
builder.Services.AddDbContext<LibraryDbContext>(options =>
options.UseSqlServer(connectionString, o => o.MigrationsAssembly(assemblyName))
);
这里只是写个 demo 我就没有封装太美了, 关键就是那个 options.UseSqlServer 要让 Application 负责就可以了.
还有一点就是一定要配上 MigrationsAssembly.
ReplaceService IModelCustomizer
OpenIddict 用的是 ReplaceService

然后

然后

这个方案我也是不太喜欢 (就不多介绍了), 要知道 ReplaceService 只能用一次丫, 你用了其它 Library 也要用就完了.
关于这个方案也可以看这篇 Using Entity Framework Core IModelCustomizer to target multiple data stores
还有它的 limitation
ModelBuilder 扩展
这个是我在 AutoHistory 插件看见的

拦截到了, modelBuilder 就可以用来做 config 了

虽然写不了 DbSet 这种东西, 但是不要紧.
public DbSet<Product> Products => Set<Product>();
调用的时候可以用泛型 Type

我觉得这个方案算是最简单的了.
EF Core – Library use EF的更多相关文章
- EF Core 快速上手——EF Core的三种主要关系类型
系列文章 EF Core 快速上手--EF Core 入门 本节导航 三种数据库关系类型建模 Migration方式创建和习修改数据库 定义和创建应用DbContext 将复杂查询拆分为子查询 本 ...
- EF Core 快速上手——EF Core 入门
EF Core 快速上手--EF Core 介绍 本章导航 从本书你能学到什么 对EF6.x 程序员的一些话 EF Core 概述 1.3.1 ORM框架的缺点 第一个EF Core应用 本文是对 ...
- EF Core 迁移过程遇到EF Core tools version版本不相符的解决方案
如果你使用命令: PM> add-migration Inital 提示如下信息时: The EF Core tools version '2.1.1-rtm-30846' is older t ...
- EF Core 三 、 EF Core CRUD
EF Core CRUD 上篇文章中,我们已经基本入门了EFCore,搭建了一个简单的EFCore项目,本文开始简单使用下EF,做增删改查的相关操作: 一.数据新增操作(C) public stati ...
- IOC+EF+Core项目搭建EF封装(一)
添加应用Microsoft.EntityFrameworkCore:Microsoft.EntityFrameworkCore.Design:Microsoft.EntityFrameworkCore ...
- EF Core中Fluent Api如何删除指定数据表中的行
这两天一直在研究在code first下如何删除数据表中的指定行,于是开始搜狗,后来百度,压根就找不到资料,后来一想可能我的搜索关键字有问题,而且ef core命令与ef的命令差不多,于是从这两个方面 ...
- EF core 性能调优
Entity Framework Core performance tuning – a worked example Last Updated: February 25, 2019 | Create ...
- [翻译 EF Core in Action 1.10] 应该在项目中使用EF Core吗?
Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Cor ...
- [翻译 EF Core in Action 1.11] 何时不应该使用EF Core
Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Cor ...
- EF Core 快速上手——创建应用的DbContext
系列文章 EF Core 快速上手--EF Core 入门 EF Core 快速上手--EF Core的三种主要关系类型 本节导航 定义应用的DbContext 创建DbContext的一个实例 创建 ...
随机推荐
- 手把手教你!STM32单片机入门指南:从初级到中级工程师的学习路线
在当今科技日新月异的时代,嵌入式系统作为智能设备的核心驱动力,正以前所未有的速度渗透到我们生活的方方面面.STM32系列微控制器,以其高性能.低功耗及丰富的外设资源,成了许多开发者踏入嵌入式领域首选 ...
- 登录到第一级终端后,如果再次ssh登录到其他终端,SecureCRT标签变更的问题
"终端->仿真->高级",勾选"忽略窗口标题更改请求"
- golang对遍历目录操作的优化
一转眼go1.23都快发布了,时间过得真快. 不过今天我们把时间倒流回三年半之前,来关注一个在go1.16引入的关于处理目录时的优化. 对于go1.16的新变化,大家印象最深的可能是io包的大规模重构 ...
- [rCore学习笔记 021]多道程序与分时任务
写在前面 本随笔是非常菜的菜鸡写的.如有问题请及时提出. 可以联系:1160712160@qq.com GitHhub:https://github.com/WindDevil (目前啥也没有 导读 ...
- 人工智能(AI)未来之方向:努力培养人才、科研创新!
地址: https://baijiahao.baidu.com/s?id=1801824912676717630&wfr=spider&for=pc 人工智能(AI)未来之方向 1. ...
- 电视家APP会员退款了 —— 网络电视APP的合规性处理
今天打开家里网络电视的时候突然发现"电视家APP"居然无法使用了,随后发现账户关联的银行卡收到退款了,于是好奇的研究了一下这个事情. 由于家里是在农村,闭路电视的图像效果很差,估计 ...
- 在计算框架MindSpore中手动保存参数变量(Parameter 变量)—— from mindspore.train.serialization import save_checkpoint
本文参考内容: https://www.mindspore.cn/doc/programming_guide/zh-CN/r1.2/advanced_usage_of_checkpoint.html? ...
- 如何将 Vim 剪贴板里面的东西粘贴到 Vim 之外的地方? (Ubuntu18.04系统亲测)
主要参考内容: https://www.zhihu.com/question/19863631 在vim中剪贴中的内容是难以在vim之外使用的,那么怎么修改这个问题呢? =============== ...
- .gitignore文件的使用方法(学习总结版)—— .gitignore 文件的配合用法
本文紧接前文: .gitignore文件的使用方法(学习总结版) ============================================= 本文主要讨论前文中所说的一个操作,即: . ...
- pytorch中使用vutils对多张图像进行拼接 (import torchvision.utils as vutils)
1.png 2.png 在pytorch中使用torchvision的vutils函数实现对多张图片的拼接.具体操作就是将上面的两张图片,1.png和2.png的多张图片进行拼接形成一张图片,拼接后的 ...