前言

SQL Server 支持 JSON, 以前写过一篇介绍 SQL Server – Work with JSON. 但 EF Core 一直没有支持.

直到 EF Core 7.0 才支持.

参考

Docs – JSON Columns

YouTube – JSON Columns - New in Entity Framework Core 7

配置

public class Customer
{
public int Id { get; set; }
public string Name { get; set; } = "";
public Address Address { get; set; } = null!;
} public class Address
{
public string Line1 { get; set; } = "";
public string Line2 { get; set; } = "";
}

Address 是一个对象. 过往我们会把它配置成 Owned Entity, 属性 Line1, Line2 分别占据数据库 2 个 column. column name 是 Address_Line1, Address_Line2

这样是 ok 的, 但有时候我们希望它在数据库就一个 column, 然后用 JSON 格式保存资料. 反正数据库也支持 JSON 查询 (只是性能不容易优化), 一堆 column 毕竟很乱.

声明使用 JSON Column

它算是 Owned Entity 的扩展, 表面上依然是 Owned Entity, 但多了一个 ToJson() 声明

modelBuilder.Entity<Customer>().ToTable("Customer");
modelBuilder.Entity<Customer>().Property(e => e.Name).HasMaxLength(256);
modelBuilder.Entity<Customer>().OwnsOne(e => e.Address, addressBuilder =>
{
addressBuilder.ToJson();
addressBuilder.Property(e => e.Line1).HasMaxLength(256);
addressBuilder.Property(e => e.Line2).HasMaxLength(256);
});

数据库长相

生成出来的数据长这样. Address 值就是 JSON 格式

查询的 LINQ 是完全一样的, EF Core 在背地里会转换成对应的 JSON Query

var customers = await db.Customers.Where(e => e.Address.Line1 == "lorem 1").ToListAsync();

Query

嵌套

如果有多层, 只需要在最上层设置 ToJson() 就可以了.

Update Value

像平常一样直接 update Entity 就可以了. EF Core 会转换成 JSON_MODIFY 语句去更新

Array OwnsMany

除了对象, Array 也是可以的. 使用 OwnsMany. 操作和 OwnsOne 一摸一样.

modelBuilder.Entity<Customer>().OwnsMany(e => e.Addresses, addressesBuilder =>
{
addressesBuilder.ToJson();
addressesBuilder.Property(e => e.Line1).HasMaxLength(256);
addressesBuilder.Property(e => e.Line2).HasMaxLength(256);
});

query

var customer = await db.Customers.Where(e => e.Addresses.Count() > 3).ToListAsync(); 

Limitation

Github – Support spatial types in JSON columns

Github – Json: add support for collection of primitive types

EF Core – JSON Column的更多相关文章

  1. 在.NET Core类库中使用EF Core迁移数据库到SQL Server

    前言 如果大家刚使用EntityFramework Core作为ORM框架的话,想必都会遇到数据库迁移的一些问题. 起初我是在ASP.NET Core的Web项目中进行的,但后来发现放在此处并不是很合 ...

  2. 如何使用ASP.NET Core、EF Core、ABP(ASP.NET Boilerplate)创建分层的Web应用程序(第一部分)

    本文是为了学习ABP的使用,是翻译ABP官方文档的一篇实战教程,我暂时是优先翻译自己感兴趣或者比较想学习的部分,后续有时间希望能将ABP系列翻译出来,除了自己能学习外,有可能的话希望帮助一些英文阅读能 ...

  3. Asp.net core 学习笔记 ( ef core )

    更新 : 2018-11-26 这里记入一下关于 foreignKey cascade action 默认情况下如果我们使用 data annotation required + foreginkey ...

  4. ASP.NET Core使用EF Core操作MySql数据库

    ASP.NET Core操作MySql数据库, 这样整套环境都可以布署在Linux上 使用微软的 Microsoft.EntityFrameworkCore(2.1.4) 和MySql出的 MySql ...

  5. 项目开发中的一些注意事项以及技巧总结 基于Repository模式设计项目架构—你可以参考的项目架构设计 Asp.Net Core中使用RSA加密 EF Core中的多对多映射如何实现? asp.net core下的如何给网站做安全设置 获取服务端https证书 Js异常捕获

    项目开发中的一些注意事项以及技巧总结   1.jquery采用ajax向后端请求时,MVC框架并不能返回View的数据,也就是一般我们使用View().PartialView()等,只能返回json以 ...

  6. .Net Core2.2 + EF Core + DI,三层框架项目搭建教程

    笔记: 近两年.Net Core发展的很快,目前最新版为3.0预览版,之前在网上买了一本1.1版书籍都还没来得及看呢,估计现在拿出来看也毫无意义了.已多年.net工作经验,看书不如直接实际上手来得快, ...

  7. ASP.Net Core5.0 EF Core使用记录

    打算把之前开源的 基于ASP.Net Core开发一套通用后台框架 重新用ASP.Net Core 5写一遍,也算是巩固一下旧知识,学习下新知识.本文是项目搭建初期关于 EF Core 的使用记录 1 ...

  8. 使用EF Core更新与修改生产数据库

    使用EF Core的Code First,在设计阶段,直接使用Database.EnsureCreated()和EnsureDeleted()可以快速删除.更新最新的数据结构.由于没有什么数据,删除的 ...

  9. EF Core 数据库迁移(Migration)

    工具与环境介绍 1.开发环境为vs 2015 2.mysql EF Core支持采用  Pomelo.EntityFrameworkCore.MySql   源代码地址(https://github. ...

  10. Asp.net Core 通过 Ef Core 访问、管理Mysql

    本文地址:http://www.cnblogs.com/likeli/p/5910524.html 环境 dotnet Core版本:1.0.0-preview2-003131 本文分为Window环 ...

随机推荐

  1. MySQL索引是怎么支撑千万级表的快速查找?

    前言 在 MySQL 官方提到,改善操作性能的最佳方法 SELECT 在查询中测试的一个或多个列上创建索引.索引条目的作用类似于指向表行的指针,从而使查询可以快速确定哪些行与WHERE子句中的条件匹配 ...

  2. JMeter 逻辑控制之IF条件控制器

    逻辑控制之IF条件控制器 测试环境 JMeter-5.4.1 循环控制器介绍 添加While Controller 右键线程组->添加->逻辑控制器->While控制器 控制器面板介 ...

  3. WPF控件库

    Welcome to CookPopularControl 介绍 CookPopularControl是支持.NetFramework4.6.1与.Net5.0的WPF控件库,其中参考了一些资料,目前 ...

  4. pytorch问题记录

    1.找不到fused 2.找不到torch_extensions 网上的教程一般都是linux系统的,Windows这个是在C盘目录下 3.c++开发环境中找不到vcvars64.bat 解决方法:重 ...

  5. 【Java】Collection子接口:其一 List 列接口

    Collection子接口 其一:List接口List 接口存储结构:元素有序,且可重复,每个元素都有对应的索引根据索引获取容器元素 实现类有:ArrayList.LinkedList.Vector ...

  6. 【JS】02 基础语法

    JS的引入方式: 第一种: 就是我们在HTML标签中使用script标签,然后在这个标签中可以书写JS代码 type="text/javascript"  可以不用写,浏览器会根据 ...

  7. 【OracleDB】 09 创建和管理表

    Oracle常见的数据库对象 - 表 基本的数据存储集合,行与列组成 - 视图 抽取的逻辑集合 - 序列 提供规律性的数值 - 索引 提高查询效率 - 同义词 对象别名 TABLE 表 用户定义的表: ...

  8. PyCharm2024 专业版激活设置中文

    PyCharm2024 专业版激活设置中文 官网下载最新版:https://www.jetbrains.com/zh-cn/pycharm/download 「hack-jet激活idea家族.zip ...

  9. 如何在无窗口模式下运行GPG——如何在命令行模式下使用gpg生成秘钥:How to make gpg prompt for passphrase on CLI——GPG prompt for password in command line

    参考: Unable to generate a key with GnuPG (agent_genkey failed: No such file or directory) ["No s ...

  10. 强化学习算法真的适合于你的应用吗 —— 强化学习研究方向(研究领域)现有的不足(短板、无法落地性) —— Why You (Probably) Shouldn’t Use Reinforcement Learning

    外文原文: Why You (Probably) Shouldn't Use Reinforcement Learning 地址: https://towardsdatascience.com/why ...