微软在 Entity Framework Core 2+ 中引入了全局查询过滤器,简化了构建多租户应用程序和实体软删除的复杂度。这篇文章我将通过代码的形式对全局过滤查询进行详细的讲解。...在讲解前我们先来简单说一下什么是多租户,所谓多租户简单来说是指一个单独的实例可以为多个组织服务。...我们新建一个项目,在项目中重写 DbContext 上下文里的 OnModelCreating 方法,在这个方法中我们使用 HasQueryFilter 方法进行软删除。...方法中,通过注入的 entityTypeProvider 获取需要全局查询过滤的类型集合,并进行遍历,调用得到进行查询过滤的方法传入 modelBuilder 参数,从而实现多租户查询过滤。...(modelBuilder); } 三、总结 这篇文章这是简单的实现了多租户和软删除,队医业务场景更加复杂的项目,我们需要利用一些特殊方法来实现全局查询过滤器。
模型级过滤器将使用正确的上下文实例中的值,即执行查询的那个。 使用 IgnoreQueryFilters() 方法在一次查询中禁用过滤器。...在以前的ef版本中,调用查询api时,可以通过自动编译并缓存编译的结果达到一次计算多次调用,有效的提高了ef的性能,显示编译查询(Explicitly compiled queries)这种机制可以绕过缓存查找的性能消耗...,可以在LINQ查询中使用。 ...一旦注册了方法,您就可以在查询的任何地方使用它。 要注意的几件事: 按照惯例,在生成SQL时,该方法的名称用作函数的名称(在本例中是用户定义的函数),但可以在方法注册期间重写名称和schema。...目前只支持标量函数 EF Core迁移将不负责创建它,您必须在数据库中创建映射函数 九.code first 实体配置 在EF6可以通过 EntityTypeConfiguraiton 封装特定实体类型的配置代码
此功能允许在元数据模型(一般在OnModelCreating)中直接在实体类型上定义LINQ查询条件(通常传递给LINQ Where查询运算符的布尔表达式)。...> 5 select p; 值得注意的是: 在生成SQL时,该方法的名称将用作函数的名称(在本例中为用户定义的函数),但在方法注册期间可以覆盖名称和模式 目前只支持标量功能 必须自行在数据库中创建映射函数...显式编译的查询API已经在以前版本的EF和LINQ to SQL中可用,以允许应用程序缓存查询的翻译,以便它们只能被计算一次并执行多次。...,添加更多的数据库方法),EF Core可以使用它们来定义映射到数据库函数或操作符的方法,以便可以在LINQ查询中调用它们。...,当对内存中的数据进行查询时,或者在客户端需要发生相关的内存查询时,可以方便很多.
默认情况下,将在你的本地机器上,使用上下文对象名称,有许多方式来覆盖这个行为,最简单的方式是在配置文件中增加一个名字为上下文对象名称的数据库连接串,在我这里,叫做 MyDomainContext,还可以通过实现一个构造函数...我甚至都没有在数据上下文中将雇员加入到雇员的集合中,因为他们被引用到订单的集合中,EF 帮我们完成了。...由 SQL Server 在每次记录被更新的时候维护这个列。为了告诉 EF 在实体中有一个属性表示并发标识,你可以通过标签 [ConcurrencyCheck] 来标识这个属性,或者使用模型构建器。...整个的层次被展开到一张表中,基类中没有的属性被自动标记为可空。...,和直接使用Sql进行查询的优势在于,我们可以在 LINQ 之上进行查询,最终进行查询的 SQL 是经过合并的。
可以使索引唯一,如下所示: protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity...索引名称 按照约定,在关系数据库中创建的索引将命名为 IX__。 对于复合索引,变成以下划线分隔的属性名称列表。...您可以使用 "熟知 API" 设置在数据库中创建的索引的名称: protected override void OnModelCreating(ModelBuilder modelBuilder) {...当查询中的所有列都作为键列或非键列包含在索引中时,这可以显著提高查询性能,因为表本身无需访问。 有关 SQL Server 包含列的详细信息,请参阅文档。...在下面的示例中,Url 列是索引键的一部分,因此对该列的任何查询筛选都可以使用索引。
ASP.NET Core 配置系统非常灵活,并且可以将连接字符串存储在 appsettings.json 、环境变量、用户密钥存储或其他配置源中 appsettings.json { "ConnectionStrings...异步操作对于在丰富的客户端应用程序中保持响应式 UI 非常重要,并且还可以增加 web 应用程序中的吞吐量,在这些应用程序中,它们可释放线程以处理 web 应用程序中的其他请求 var blog = new...上下文池可以通过重复使用上下文实例,而不是为每个请求创建新实例,从而提高大规模方案(如 web 服务器)的吞吐量。...().ToString(); 新增一条数据,返回 Id 是自动生成的 028.jpg 通过数据批注方式添加创建时间,修改时间默认值 Entity /// /// 创建时间 ///...此属性也被视为并发标记,这确保了在你查询行后,如果正在更新的行发生了更改,则会出现异常。
ASP.NET Core 配置系统非常灵活,并且可以将连接字符串存储在 appsettings.json 、环境变量、用户密钥存储或其他配置源中 appsettings.json { "ConnectionStrings...异步操作对于在丰富的客户端应用程序中保持响应式 UI 非常重要,并且还可以增加 web 应用程序中的吞吐量,在这些应用程序中,它们可释放线程以处理 web 应用程序中的其他请求 var blog = new...上下文池可以通过重复使用上下文实例,而不是为每个请求创建新实例,从而提高大规模方案(如 web 服务器)的吞吐量。...通过数据批注方式添加创建时间,修改时间默认值 Entity /// /// 创建时间 /// [DatabaseGenerated(DatabaseGeneratedOption.Identity...此属性也被视为并发标记,这确保了在你查询行后,如果正在更新的行发生了更改,则会出现异常。
ShardingDbContext的扩展 在sharding-core中核心api接口依然是通过dbcontext的继承来实现的,首先是拦截sql,总的有两条路可以走1.通过efcore提供的拦截器拦截...中的作用 IDbSetSource 用于针对efcore的dbcontext.setentity>()和dbsetentity>()进行拦截和api重构具体是现代吗ShardingDbSetSource...//dbcontext下的这个方法在dbcontext被创建后第一次调用Model属性会被加载如果缓存已存在那么不会被多次加载 protected override void OnModelCreating...(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); } 说人话就是我可以再这边通过...modelBuilder获取我自己想要的对象但是如果我把Entity映射到了table1那么这个dbcontext就会被缓存起来entity-table1这个关系也会被缓存起来没办法改变了,那么是否有办法可以解决这个机制呢有两个
FluentAPI方式通过在OnModelCreating方法中添加代码逻辑来完成,也可以通过实现IEntityTypeConfiguration类来完成,方式灵活,更能更加强大。...(b => EF.Property(b, "LastUpdated")); 索引 索引是用来提高查询效率的,在EF Core中,索引的定义仅支持FluentAPI方式。...FluentAPI方式代码: modelBuilder.Entity() .HasIndex(b => b.Url); 可以配合唯一约束创建索引: modelBuilder.Entity...=> c.CreateTime) .HasValueGenerator() .ValueGeneratedOnAddOrUpdate(); 按照我的理解应该可以在添加和更新时设置...查询类型很有用,EF Core不会对它进行跟踪,也不允许新增、修改和删除操作,但是在映射到视图、查询对象、Sql语句查询、只读库的表等情况下用到。
entityframework是可以完全做到无缝切换,毕竟ORM的设计就是为了兼容不同的底层数据库。...,MySql.Data,注意:MySql.Data.Entity 和 MySql.Data.EntityFramework 应该只要一个就好了,我就安装 MySql.Data.EntityFramewor...目前我的解决方法是,通过修改web.config,在需要用scaffold生成controller的时候把涉及到mysql entityframework的配置全部还原成sql server的配置,等生成成功了...,在把配置改回到mysql....我不知道你们有没有遇到这样的问题,有完美解决的解决方案吗。如果知道的请留言,不甚感激
ORM 框架 EF Core快速开始示例 创建一个空的 web api 项目 添加 Pomelo.EntityFrameworkCore.Mysql 的 nuget 包引用 创建实体 创建 DbContext...配置连接字符串并且注入 DbContext 使用 DbContext 完成数据查询与插入 创建实体 Entity namespace LighterApi.Data { public class...{ get; set; } /// /// 全局唯一的身份 /// public string...(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); } }...初始化数据库 ,注意在初始化以前确保正确配置了连接字符串,并且在startup.cs中添加了DbContext的注入 // 安装dotnet tool ef工具 dotnet tool install
这时我们可以通过Fluent API 来忽略指定的模型映射到数据库中,代码写在EF上下文中: protected override void OnModelCreating(DbModelBuilder...二、关系约定 在数据库中,我们可以通过多张表的关联查询出数据,这多张表之间的关联,就是他们的关系。同样,也可以在模型中定义这样的关系。...自定义约定可以看作全局约定规则,将会运用到所有实体和属性,也可以显示实现应用到指定的模型上。...自定义约定包含一个约定接口 IConvention,IConceptualModelConvention 是概念模型接口,在模型创建后被调用,IStoreModelConvention 接口为存储模型接口...,在模型创建之后用于操作对模型的存储,***自定义类约定***都必须在 OnModelCreating 方法中显式配置,例如我们要将模型中类型为DateTime的属性映射为datetime2,可进行如下配置
工作单元) DB Set(Repository 仓储) EF Core 提供一个 DB Context 和多个 DB Set 组合完成数据查询和更新操作的 ORM 框架 EF Core快速开始示例 创建一个空的...DbContext 完成数据查询与插入 创建实体 Entity namespace LighterApi.Data { public class Entity { //...Id /// public string Id { get; set; } /// /// 全局唯一的身份...初始化数据库 ,注意在初始化以前确保正确配置了连接字符串,并且在startup.cs中添加了DbContext的注入 // 安装dotnet tool ef工具 dotnet tool install...Postman 中添加环境变量 ?
最近一直在忙各种家中事务和公司的新框架 终于抽出时间来更新一波了。 本篇主要讲一下关于Entity Framework Core访问oracle数据库的采坑。。...强调一下,本篇文章发布之前 关于Entity Framework Core访问oracle数据库的甲骨文官方dll还未正式发布。 不过我已经在项目中用起来了。。介意的兄弟可以先等等。。...3.关于在Docker中部署的坑 在我的生产项目中。应该是打包到docker直接运行部署的。 不过在打包到docker的过程中又出现了诡异的问题。 就不重现了。。反正就是开发环境没有问题。。...直接放到linux中也没问题。但是一旦打包到docker运行 就会查询不到数据。 经过多方查证 最终发现是微软提供的rumtime镜像,因为是精简版系统 所以里面的市区有问题。...在dockerfile中添加如下语句 在生成的时候 设置好时区: FROM microsoft/dotnet:2.1-aspnetcore-runtime ENV TZ=Asia/Shanghai 这样就能成功的操作到数据库了
还记得我们第一步中MyContext定义的OnModelCreating方法吗,Fluent Api就是在那里面使用的 增加以下代码至OnModelCreating方法。...包含和排除实体类型 将实体在Context中映射到数据库有多种方式: 使用DbSet定义属性。 在OnModelCreating方法中使用Fluent Api配置。...假如导航属性中存在对其他实体的引用,那么即便不把被引用实体配置为显式引用,被引用实体也可以隐式地映射到数据库中。 如以下代码所示。...Blog实体包含对Post实体的引用,而独立的AuditEntry则可以在OnModelCreating方法中进行配置。...在Fluent Api中,有两种方法可以指定备用键,一种是当开发者将实体中的属性作为另一个实体的外键目标,另一种是手动指定。EF CORE的默认约束是前者。
聪明的同学一定想到了我们可以手动创建另一个中间表,它将建立ShoppingCart和Commodity多对多的关系。...复合主键由两列组成一个主键,在EF Core中创建复合键唯一办法是在OnModelCreating中创建。...builder.Entity().HasKey(p => new { p.ShoppingCartId, p.CommodityId}); } 到这里可以说才解决了...解决了多对多创建表的问题,下面我们就来看一下如何进行增删查。 二、增 我们要把商品添加到购物车中,我们需要创建ShoppingCartCommodity并保存它。...Include查询即可。
CRUD的基本操作,并且可以在asp.net core 2中集成Nlog了。...他们俩可以在数据库中映射成一个表;或者在没有继承的情况下,数据库中的一个表可能和多个类有映射关系。...创建 Entity Entity就是普通的C#类,就像Dto一样。...可以在命令行查询本机LocalDb的实例,使用sqllocaldb info: 也可以通过VS的Sql Server Object Explorer查看: 连接字符串中的ProductDb是数据库名...Database.EnsureCreated()确实可以保证创建数据库,但是随着代码不断被编写,我们的Model不断再改变,数据库应该也随之改变,而EnsureCreated()就不够了,这就需要迁移(
记录主要有以下内容: 从官网创建并下载项目(.net core 3.x + vue) 项目在本地成功运行 新增实体并映射到数据库 完成对新增实体的基本增删改查 ABP官网:https://aspnetboilerplate.com...Get started,选择前后端技术栈,我这里就选.net core 3.x和vue。 ? 填写自己的项目名称,邮箱,然后点create my project就可以下载项目了。 ? 解压文件 ?...我这里继承了abp的Entity类,Entity类有主键ID属性,这个泛型int是指主键的类型,不写默认就是int。...(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Entity...Dto CreateSimpleDto,新增Simple数据的传输对象,比如ID,创建时间,创建人等字段,就可以省略 public class CreateSimpleDto { public
在之前的文章中,你已经学习了如何使用同步编程模型来读取和更新数据,在本节中你将学习如何实现异步编程模型。异步可以使应用程序执行更有效率,因为它可以更有效的使用服务器资源。...在Entity Framework的早期版本中,你可以通过原始SQL查询来使用存储过程来检索数据,但是你不能在更新操作中使用存储过程。...在Entity Framework 6中,你可以通过配置Code First来使用存储过程。...1.打开DAL\SchoolContext.cs,在OnModelCreating 方法中添加如下代码 protected override void OnModelCreating(DbModelBuilder...如果你正在使用现有的数据库,你可能需要自定义存储过程的名称以便使用数据库中已定义的存储过程。 如果你希望自定义存储过程,你可以编辑Up方法中创建存储过程的框架代码。
CRUD的基本操作,并且可以在asp.net core 2中集成Nlog了。...他们俩可以在数据库中映射成一个表;或者在没有继承的情况下,数据库中的一个表可能和多个类有映射关系。...创建 Entity Entity就是普通的C#类,就像Dto一样。...关于连接字符串,我是用的是LocalDb,实例名是MSSQLLocalDB。可以在命令行查询本机LocalDb的实例,使用sqllocaldb info: ?...生产环境: 在项目的属性--Debug里面,我们看到了环境变量: ? 而这个环境变量,我们可以在程序中读取出来,所以可以在这里添加连接字符串: ?
领取专属 10元无门槛券
手把手带您无忧上云