如何使用Postgres SQL、NoSql和Entity Framework Core
你好。我将逐步向您展示如何使用 Postgres 和对 EFCore 的支持同时使用关系和非关系数据库。 Postgres Postgres 是 Oracle 公司拥有的对象关系数据库,但它是一个拥有强大社区支持的开源数据库。鉴于其 30 年的市场历史,Postgres 非常强大和可靠。 数据类型 基元:整数、数字、字符串、布尔值 结构化:日期/时间、数组、范围/多范围、UUID 文档:JSON
你好。我将逐步向您展示如何使用 Postgres 和对 EFCore 的支持同时使用关系和非关系数据库。
Postgres
Postgres 是 Oracle 公司拥有的对象关系数据库,但它是一个拥有强大社区支持的开源数据库。鉴于其 30 年的市场历史,Postgres 非常强大和可靠。
数据类型
基元:整数、数字、字符串、布尔值
结构化:日期/时间、数组、范围/多范围、UUID
文档:JSON/JSONB、XML、键值(Hstore)
几何:点、线、圆、多边形
自定义:复合,自定义类型
JSON/JSONB - 使用 NSql
Postgres 数据库的奇迹之一是可以在同一个数据库、同一个对象、同一个表中以关系和非关系方式工作。是的 !可以通过 Document 数据类型接收 Json 和 JsonBinary (JsonB) 数据。
实体框架核心 ORM
为了能够在我们使用 NSql 的方法中使用 EFcore,我们需要安装一个名为npgsql.entityframeworkcore.postgresql
的 nuget 包,这将使我们能够使 CRUD 方法更类似于我们习惯的 EFCore ORM。
练习 - 配置
包
npgsql.entityframeworkcore.postgresql Microsoft.EntityFrameworkCore Microsoft.EntityFrameworkCore.Design Microsoft.EntityFrameworkCore.Toll EFCore.NamingConventions
启动
ConfigureServices Method
services.AddDbContext<PostgresNsql.MyContext>(option => option.UseNpgsql(Configuration.GetConnectionString("Nsql")));
进入全屏模式 退出全屏模式
数据库上下文
public class MyContext : DbContext
{
public MyContext(DbContextOptions options) :base(options)
{
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder
.UseNpgsql()
.UseSnakeCaseNamingConvention();
protected override void OnModelCreating(ModelBuilder modelBuilder)
=> modelBuilder
.Entity<DataModel>()
.Property(e => e.Id)
.UseIdentityAlwaysColumn();
public DbSet<DataModel> DataModels { get; set; }
}
进入全屏模式 退出全屏模式
UseSnakeCaseNamingConvention()
Snake Case 可能需要处理用 _ 下划线分隔 2 个单词的 JSON。这样你就不会有序列化的问题。
为 ID 列设置自动增量
.Property(e => e.Id) .UseIdentityAlwaysColumn();
Identity always 列是你可以赋予的赋值类型之一,在这种模式下你定义的值将直接在数据库中生成,使你无法在插入数据库时设置值。
型号
在创建模型方面是同时使用 SQL 和 NSql 的一大飞跃。如果您还有不稳定的数据并且它不是 100% 可映射和结构化的,您可以使用 DataType Json 来获取数据的 NSql 部分。
为此,您需要添加System.Text.Json
库并使用 JsonDocument 类键入它的属性,因为它已经识别出将以 JSON 格式接收的数据,并将促进 de-cerealization。
该模型需要是 IDisposable,因为 JsonDocument 类也是 IDisposable,从而改进了内存管理。
public class DataModel : IDisposable
{
public int Id { get; set; }
public string Nome { get; set; }
public int idade { get; set; }
public JsonDocument Data { get; set; }
public void Dispose() => Data?.Dispose();
}
进入全屏模式 退出全屏模式
结构化数据
为了识别我们模型的 NSql 部分,我们需要添加 Data Notation[Column(TypeName = "jsonb")]
来识别 Json 对象并映射属性。
public class DataModel
{
public int Id { get; set; }
public string Nome { get; set; }
public int idade { get; set; }
[Column(TypeName = "jsonb")]
public Endereco Address { get; set; }
}
public class Endereco // Mapping the JSON Data received
{
public string Rua { get; set; }
public int Numero { get; set; }
public Casa[] Casas { get; set; }
}
public class Casa
{
public decimal Preco { get; set; }
public string EnderecoCompleto { get; set; }
}
进入全屏模式 退出全屏模式
CRUD
我没有使用存储库或更复杂的架构来使文章更易于理解。
但我现在将在 Controller 中展示我们如何处理 JSON 类型的数据。
全部获取()
请注意,所有列的列表中没有任何变化。
public List<DataModel> GetAll()
{
return _myContext.DataModels.ToList();
}
进入全屏模式 退出全屏模式
获取自定义
当我开始使用 Postgres SQL 和 NSql 时,我遇到的一个问题是它是否可以在查询中完成,加入 SQL 和 NSql 数据。下面是一个 Get 示例,我在其中参数化我只想要 12 岁的结果并且姓氏等于“Paixao”。 Age 是来自 age 列的 SQL 值,“lastname”是我们以 JSON 格式接收的数据项。
public IEnumerable<string> Get()
{
var resultado = _myContext.DataModels;
return resultado.Where(x => x.idade == 12 && x.Data.RootElement.GetProperty("lastName").GetString() == "Paixao").ToList();
}
进入全屏模式 退出全屏模式
我带来的另一个示例是,如果您只想在 JSON 中显示 1 个数据项。
public IEnumerable<string> Get()
{
var resultado = _myContext.DataModels;
return resultado.Select(x=>x.Data.RootElement.GetProperty("lastName").GetString()).ToList();
}
进入全屏模式 退出全屏模式
上述代码中JsonElement类的元素
RootElement
是一个类,它将从Data
属性中获取 JSON 数据,然后您可以使用GetProperty("property")
方法命名您将使用的 JSON 属性,最后您必须输入GetString method ()
以将您过滤的 JSON 数据转换为字符串。
谢谢
.ltag__user__id__729596.follow-action-button { background-color: #0!important;颜色:#ffffff!重要;边框颜色:#0!重要; }[
](/mgpaixao)
Matheus Paixão关注
我喜欢分享知识,因为我就是这样学会编程的。我的工作就是每天比昨天知道的更多。可以打电话给我,一起学习。快乐 u003d)
更多推荐
所有评论(0)