Gif

你好。我将逐步向您展示如何使用 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 数据转换为字符串。

Gif

谢谢

.ltag__user__id__729596.follow-action-button { background-color: #0!important;颜色:#ffffff!重要;边框颜色:#0!重要; }[

mgpaixao 图像

](/mgpaixao)

Matheus Paixão关注

我喜欢分享知识,因为我就是这样学会编程的。我的工作就是每天比昨天知道的更多。可以打电话给我,一起学习。快乐 u003d)

Logo

PostgreSQL社区为您提供最前沿的新闻资讯和知识内容

更多推荐