首页 > 数据库 >[EF Core小妙招] 重写SQL生成器

[EF Core小妙招] 重写SQL生成器

时间:2023-03-17 14:13:42浏览次数:38  
标签:Core EF 生成器 optionsBuilder SQL 重写

[EF Core] EF Core Code-First 移除外键 —— 重写SQL生成器

使用EF Core时最烦的就是生成的某些 SQL 其实并不是你想要的结果,例如外键约束等等。

一个最简单的例子就是,因为EF Core会根据导航属性生成外键约束等原因,导致很多开发者抛弃了更易维护的Code First模式,而转为Db First以获取更自由的数据库结构。

其实我们可以通过重写EF CoreMigrationsSqlGenerator来解决:

public class CustomMigrationsSqlGenerator : MigrationsSqlGenerator
{
    public CustomMigrationsSqlGenerator(MigrationsSqlGeneratorDependencies dependencies, IMigrationsAnnotationProvider migrationsAnnotations) : base(dependencies)
    {
    }

    protected override void Generate(Microsoft.EntityFrameworkCore.Migrations.Operations.CreateTableOperation operation, IModel? model, MigrationCommandListBuilder builder, bool terminate = true)
    {
        operation.ForeignKeys.Clear();
        base.Generate(operation, model, builder, terminate);
    }
}
public class CustomDbContext : DbContext
{
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        // ...
        optionsBuilder.ReplaceService<IMigrationsSqlGenerator, CustomMigrationsSqlGenerator>();
        // ...
    }
}

上述代码便提供了移除ForeignKeys即表结构中的外键约束。当然,需要在DbContext中重写OnConfiguring方法,使用optionsBuilder.ReplaceService将默认的SQL生成器,替换为我们自己实现的部分,就可以在EF Core生成数据库结构时,直接去除外键约束了。

初次之外,根据MigrationsSqlGenerator暴露出来的 API 来看,我们还能做很多事情,例如重写字段的类型或者在实体上做文章,具体需要大家根据场景进行探寻了。

标签:Core,EF,生成器,optionsBuilder,SQL,重写
From: https://www.cnblogs.com/donpangpang/p/17226543.html

相关文章

  • 一个.Net Core开源缓存中间件,简单、方便使用缓存
    上次给大家推荐过一个缓存中间件《一个C#开发的非常实用的缓存中间件》,今天再给大家推荐一个缓存中间件,两者功能差不多,都是提供统一接口、多级缓存、分布式缓存、支持多种......
  • JavaScriptCore 介绍
    JavaScriptCore介绍来源https://ming1016.github.io/2018/04/21/deeply-analyse-javascriptcore/ JavaScriptCore是JavaScript引擎,通常会被叫做虚拟机,专门设计来......
  • 关于Vue3+ts引入文件使用alias别名@时报错问题,process is not defined
    如题,解决办法:一、首先确保有两个文件:   tsconfig.json  vite.config.ts(注:如果是vue.config.js,则手动改为vite.config.js)二、在ts.config.json中修改{"comp......
  • Codeforces Round 350 (Div. 2) ABCD1D2
    https://codeforces.com/contest/670A.Holidays题目大意:给定n天,求出可以休息的最大小时间和最大时间。input14output44#include<bits/stdc++.h>usingnamesp......
  • Object.definePropoty()方法详解
    Object.definePropoty()方法有三个参数第一个参数为:需要进行代理的目标对象,target第二个参数为:需要代理的这个对象中对应的"键"名,key第三个参数为:{}一个配置项......
  • Sitecore Nuget 配置
    配置SitecoreNuget包的路径配置文件路径地址:C:\Users<username>\AppData\Roaming\NuGet\NuGet.Config<?xmlversion="1.0"encoding="utf-8"?><configuration><pa......
  • 【Irrlicht引擎 笔记】Core模块
    irr::core向量、平面、数组、列表等基础类都可以在这个命名空间中找到irr::coreirr::core::vector2d<T>irr::core::vector3d<T>irr::core::vector2d<T>1.判断......
  • Codeforces Round 851 (Div. 2) (CF1788) 题解
    CF1788AOneandTwo对于一个序列,题目要求蓝色部分的乘积等于绿色部分的乘积,因为序列中只有\(1\)和\(2\),所以我们只要蓝色部分和绿色部分的\(2\)的数量相等即可,使用......
  • Codeforces Round 406 (Div. 1) C. Till I Collapse 主席树上二分
    首先贪心是显然的,但是询问有n个先考虑一个朴素的主席树做法对于每个k,对于当前固定的L,二分R,用主席树查询一下[L,R]区间内的不同数个数是否大于K个(主席树的经典应用),更新......
  • .net core 从数据库读取图片和保存图片到数据库
    usingMicrosoft.Data.SqlClient;usingSystem.Data;namespacePhotoApp;internalclassPhotoHelper{stringcreateTableSql=@"CREATETABLE[dbo].[Employ......