前言

写 Library 有时候会用到 database, 会想用 EF 来维护.

比如 Identity, IdentityServer, OpenIddict, 这些 Library 都有使用到 EF.

虽然大家都用 EF, 但它们使用的手法都不太一样哦.

这篇就来研究一下, 写 Library 的时候怎么去使用 EF.

主要参考

IdentityServer 源码

Openiddict 源码

AutoHistory 源码

相关 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的更多相关文章

  1. EF Core 快速上手——EF Core的三种主要关系类型

    系列文章 EF Core 快速上手--EF Core 入门 本节导航 三种数据库关系类型建模 Migration方式创建和习修改数据库 定义和创建应用DbContext 将复杂查询拆分为子查询   本 ...

  2. EF Core 快速上手——EF Core 入门

    EF Core 快速上手--EF Core 介绍 本章导航 从本书你能学到什么 对EF6.x 程序员的一些话 EF Core 概述 1.3.1 ORM框架的缺点 第一个EF Core应用   本文是对 ...

  3. EF Core 迁移过程遇到EF Core tools version版本不相符的解决方案

    如果你使用命令: PM> add-migration Inital 提示如下信息时: The EF Core tools version '2.1.1-rtm-30846' is older t ...

  4. EF Core 三 、 EF Core CRUD

    EF Core CRUD 上篇文章中,我们已经基本入门了EFCore,搭建了一个简单的EFCore项目,本文开始简单使用下EF,做增删改查的相关操作: 一.数据新增操作(C) public stati ...

  5. IOC+EF+Core项目搭建EF封装(一)

    添加应用Microsoft.EntityFrameworkCore:Microsoft.EntityFrameworkCore.Design:Microsoft.EntityFrameworkCore ...

  6. EF Core中Fluent Api如何删除指定数据表中的行

    这两天一直在研究在code first下如何删除数据表中的指定行,于是开始搜狗,后来百度,压根就找不到资料,后来一想可能我的搜索关键字有问题,而且ef core命令与ef的命令差不多,于是从这两个方面 ...

  7. EF core 性能调优

    Entity Framework Core performance tuning – a worked example Last Updated: February 25, 2019 | Create ...

  8. [翻译 EF Core in Action 1.10] 应该在项目中使用EF Core吗?

    Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Cor ...

  9. [翻译 EF Core in Action 1.11] 何时不应该使用EF Core

    Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Cor ...

  10. EF Core 快速上手——创建应用的DbContext

    系列文章 EF Core 快速上手--EF Core 入门 EF Core 快速上手--EF Core的三种主要关系类型 本节导航 定义应用的DbContext 创建DbContext的一个实例 创建 ...

随机推荐

  1. Apache Kyuubi 在小米大数据平台的应用实践

    导读:今天分享的主题是<Kyuubi 在小米大数据平台的应用实践>,主要分为四部分内容: Kyuubi 在小米的落地过程 打造易用和高可用的 Kyuubi 服务 基于 kyuubi 的改进 ...

  2. SUM-2024成信大天梯赛

    查看代码中有仔细的批注 L1-5 yihan的新函数 题解:(字符串)需要用到一个知识,整数与字符串之间的变换"to_string()",字符串变成整数"stoll()& ...

  3. PHP进阶

    只是简要说明起原理和用法,具体可以百度 abstract 抽象类 抽象类是指在 class 前加了 abstract 关键字且存在抽象方法,不带{},如public function test() i ...

  4. 分享一个idea的文档汉化插件

    展示效果: 如何获取:

  5. 我出一道面试题,看看你能拿 3k 还是 30k!

    大家好,我是程序员鱼皮.欢迎屏幕前的各位来到今天的模拟面试现场,接下来我会出一道经典的后端面试题,你只需要进行 4 个简单的选择,就能判断出来你的水平是新手(3k).初级(10k).中级(15k)还是 ...

  6. hadoop hive hbase flume sqoop基本操作

    top 里的id为cpu空闲度 如果wa为99.8就是负担太重.得停掉一些任务 cat /proc/cpuinfo 查看cpu信息 cat /proc/meminfo 查看内存信息 hadoop基础操 ...

  7. 【DataBase】MySQL 05 基础查询

    MySQL数据库 05 基础查询 视频参考自:P18 - P27 https://www.bilibili.com/video/BV1xW411u7ax 配套的SQL脚本:https://shimo. ...

  8. 【Docker】05 容器操作

    [查看容器 Check Container] 查看所有容器: docker ps 查看所有正在运行的,或者运行过的容器: docker ps -a 查看单个指定的容器完整信息: docker insp ...

  9. IPython notebook(Jupyter notebook) 设置密码

    本文共给出两种密码设置方法,一种为直接设置密码法(较为便捷),另一种为hash密码设置法   =================================== 第一种: 直接设置密码 注意: i ...

  10. WPF Boolean类型转化器收集 反转转化器

    参考链接 https://stackoverflow.com/questions/534575/how-do-i-invert-booleantovisibilityconverter Boolean ...