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的一个实例 创建 ...
随机推荐
- 在ubuntu16.04下,源码编译安装特定版本的MongoDB PHP扩展
背景:我的php项目在连接其他mongo库时报:Server at xxx:27017 reports wire version 5, but this version of libmongoc re ...
- selenium屏蔽启动浏览器启动时的提示信息
代码 from selenium import webdriver from selenium.webdriver import Remote from webdriver_helper import ...
- Scratch全套Q版三国人物角色素材包免费下载
全新Q版三国人物角色素材包,内含142张细腻可爱的Q版风格图片,涵盖三国名将.士兵.场景等丰富元素,为scratch爱好者提供多样选择,适合各类三国主题创作. 免费下载:www.xiaohujing. ...
- 【Vue】二维码生成
按组长提供的样例,功能比较相符合的是这个博客: https://www.jianshu.com/p/8d59107e1992 这个博客引用的是这篇文章: https://blog.csdn.net/w ...
- 【RabbitMQ】04 路由模式
在订阅模式的基础上制定一些特定发送规则 创建路由模式的生产者: 注意这些变化,跟之前的订阅模式并不一样 package cn.dzz.routineQueueInProducer; import co ...
- 【转载】逐际动力双足机器人P1在深圳塘朗山零样本、无保护、全开放完成测试
原文: https://weibo.com/1255595687/O5k4Aj8l2 [逐际动力双足机器人P1在深圳塘朗山零样本.无保护.全开放完成测试] 上周,就在全球AI界被美国初创公司Figur ...
- 使用pycharm专业版(支持远程调试及运行)如何运行mpi的代码呢???(mpi4py的代码)
问题如题: 请注意:这里pycharm专业版的远程调试及运行该如何设置不进行介绍. 由于mpi进程启动是需要执行mpiexec或mpirun命令的,然而在pycharm中我们只能远程调用Python命 ...
- 如何使用Python环境下的2D经典游戏仿真器(openai推出的)retro库运行游戏"刺猬索尼克" (SonicTheHedgehog-Genesis)
很多资料上都有使用游戏仿真器(openai推出的)retro库运行游戏"刺猬索尼克" (SonicTheHedgehog-Genesis),但是均没有给出详细的安装该款游戏的步骤 ...
- 从零体检一个魔塔社区模型(modelscope)最简单demo
从社区拿一个模型,比如以下这个链接 https://www.modelscope.cn/models/iic/cv_mobilenet-v2_bad-image-detecting 它的代码样例如下 ...
- 在Vue3中如何为路由Query参数标注类型
前言 最近发布了一款支持IOC容器的Vue3框架:Zova.与以往的OOP或者Class方案不同,Zova在界面交互层面仍然采用Setup语法,仅仅在业务层面引入IOC容器.IOC容器犹如一把钥匙,为 ...