在很多一主多从数据库的场景下,很多开发同学为了复用DbContext往往采用创建一个包含所有DbSet<Model>父类通过继承派生出Write和ReadOnly类型来实现,其实可以通过命名注入来实现一个类型注册多个实例来实现。下面来用代码演示一下。 一、环境准备 数据库选择比较流行的postgresql,我们这里选择使用helm来快速的从开源包管理...
usingVolo.Abp.EntityFrameworkCore.DependencyInjection;namespaceDotNet.EFCore.EfCore;publicstaticclassServiceDynamicDbSet{publicstaticvoidAddDefaultRepositories(thisIServiceCollection services){// 传递一个AbpCommonDbContextRegistrationOptions类型,便于RepositoryRegistrarBase基类属性注入varoptions =newAbpDbContextRegistratio...
DbSet<TEntity>:代表数据库中的一个实体表。 IDbSet<TEntity>:DbSet的接口形式,用于依赖注入等场景。 应用场景: 当你需要快速开发一个应用程序,并且希望减少直接编写SQL语句的工作量时。 当你需要一个灵活的ORM框架来支持多种数据库时。 当你希望利用.NET Core的跨平台特性来构建应用程序时。
表值函数也可映射到 .NET 方法而不是 DbSet,从而允许传递参数。可使用 HasDbFunction 设置映射。最后,现可在查询时将实体映射到视图(或映射到函数或定义查询中),而在更新时将实体映射到表:C# 复制 protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder .Entity<Blog>() .ToTable(...
//可以添加更多的DbSet属性代表其他表 } 2. 数据库连接字符串 在appsettings.json中配置数据库连接字符串,然后在Startup.cs的ConfigureServices方法中配置EFCore使用这个连接字符串。 { "ConnectionStrings":{ "BloggingDatabase":"Server=(localdb)\\mssqllocaldb;Database=Blogging;Trusted_Connection=True;" ...
以前使用EF/EFCore的开发者应该都记得,需要在DBContext里写好多DBSet,一个表对应一个DBSet,然后在其他地方操作这些DBSet对相关的表进行增删改查。 作为一个开发,这些重复操作都是我们希望避免的,我们可以利用反射机制将这些类型通过框架自带的方法循环注册进去。
以前使用EF/EFCore的开发者应该都记得,需要在DBContext里写好多DBSet,一个表对应一个DBSet,然后在其他地方操作这些DBSet对相关的表进行增删改查。作为一个开发,这些重复操作都是我们希望避免的,我们可以利用反射机制将这些类型通过框架自带的方法循环注册进去。
EFCore中每张表的CRUD操作代码大同小异,唯一的区别就是DbSet的泛型参数不同。如果要封装这些操作,我们自然会想到使用泛型来实现。首先定义一个IGenericService<TEntity>,该接口作为通用接口,泛型参数TEntity对应实体类,接口中包含了一系列的CRUD操作,代码如下: ...
未按键值标识或跟踪。 必须定义为实体类型的一部分。 (换句话说,你不能有复杂类型的 DbSet。) 可以是 .NET 值类型或引用类型。 实例可以由多个属性共享。简单示例例如,想一想 Address 类型:C# 复制 public class Address { public required string Line1 { get; set; } public string? Line2 { get; ...
Context1> options) : base(options) { } public DbSet<Entity1> Entities1 { get; set; } } public class MyDbContext2 : DbContext { public MyDbContext2(DbContextOptions<MyDbContext2> options) : base(options) { } public DbSet<Entity2> Entities2 { get; set; ...