LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

在C#中使用JSON处理主数据和动态行的子数据的一种方法

admin
2024年8月16日 8:51 本文热度 258

这个方法有些地方用着还是挺省事,优点,缺点明显。在现代企业应用程序开发中,处理复杂的主从数据结构是常见的需求。例如,在订单管理系统中,一个订单(主数据)会有多个订单项(子数据)。传统的关系型数据库可能需要多表关联和复杂的事务处理,而通过将子数据保存为JSON字符串,可以简化这些繁琐的操作。本文将详细介绍如何在C#中实现这个过程。

1. 背景介绍

主数据与子数据

主数据与子数据的关系可以通过一个简单的实例来描述。假设我们有一个订单表(Order)和订单项表(OrderItem)。

  • 表结构:

    • Order 表:包含订单ID、客户ID、订单日期等

    • OrderItem 表:包含订单项ID、订单ID、商品ID、数量、单价等


优化思路

通过将 OrderItem 转换为 JSON 字符串,并将其存储到 Order 表中的一个字段中,可以简化数据结构和操作复杂性。虽然这种方法降低了数据的规范化程度,但在很多场景下,可以提高开发和维护效率。

2. 示例实现

2.1 创建实体类

我们将创建两个实体类 OrderOrderItem,并在 Order 类中添加一个字符串属性 OrderItemsJson 来保存 JSON 格式的订单项数据。

using System;using System.Collections.Generic;using Newtonsoft.Json; // 需要安装 NuGet 包:Newtonsoft.Json
public class Order{ public int OrderId { get; set; } public int CustomerId { get; set; } public DateTime OrderDate { get; set; } public string OrderItemsJson { get; set; } // 存储订单项的 JSON 字符串}
public class OrderItem{ public int OrderItemId { get; set; } public int ProductId { get; set; } public int Quantity { get; set; } public decimal UnitPrice { get; set; }}

2.2 创建数据示例并序列化为JSON

我们将创建一个包含订单和订单项的示例,并将这些订单项序列化为JSON字符串。

class Program{    static void Main(string[] args)    {        // 创建示例订单和订单项        Order order = new Order        {            OrderId = 1,            CustomerId = 123,            OrderDate = DateTime.Now,            OrderItemsJson = SerializeOrderItems(new List<OrderItem>            {                new OrderItem{ OrderItemId = 1, ProductId = 456, Quantity = 2, UnitPrice = 12.50m },                new OrderItem{ OrderItemId = 2, ProductId = 789, Quantity = 3, UnitPrice = 15.00m }            })        };
// 显示结果 Console.WriteLine("订单ID: " + order.OrderId); Console.WriteLine("客户ID: " + order.CustomerId); Console.WriteLine("订单日期: " + order.OrderDate); Console.WriteLine("订单项JSON: " + order.OrderItemsJson); }
// 序列化订单项 static string SerializeOrderItems(List<OrderItem> orderItems) { return JsonConvert.SerializeObject(orderItems); }}

2.3 保存到数据库

在实际应用中,我们会将订单数据保存到数据库中。以EF Core为例,我们可以简单地将Order对象保存到数据库中。

Install-Package Microsoft.EntityFrameworkCoreInstall-Package Microsoft.EntityFrameworkCore.SqliteInstall-Package SQLitePCLRaw.bundle_e_sqlite3
using Microsoft.EntityFrameworkCore;
public class ApplicationDbContext : DbContext{ public DbSet<Order> Orders { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseSqlite("Data Source=orders.db"); // 配置数据库连接 }}
// 示例保存过程static void SaveOrderToDatabase(Order order){ using (var context = new ApplicationDbContext()) { context.Database.EnsureCreated(); context.Orders.Add(order); context.SaveChanges(); }}
class Program{ static void Main(string[] args) { // 初始化SQLite库 Batteries.Init();
// 创建示例订单和订单项 Order order = new Order { OrderId = 1, CustomerId = 123, OrderDate = DateTime.Now, OrderItemsJson = SerializeOrderItems(new List<OrderItem> { new OrderItem{ OrderItemId = 1, ProductId = 456, Quantity = 2, UnitPrice = 12.50m }, new OrderItem{ OrderItemId = 2, ProductId = 789, Quantity = 3, UnitPrice = 15.00m } }) };
// 保存订单到数据库 SaveOrderToDatabase(order); }
static string SerializeOrderItems(List<OrderItem> orderItems) { return JsonConvert.SerializeObject(orderItems); }}

2.4 从数据库读取并反序列化

从数据库读取订单时,可以通过反序列化 OrderItemsJson 字段来恢复订单项对象列表。

static Order ReadOrderFromDatabase(int orderId){    using (var context = new ApplicationDbContext())    {        return context.Orders.Find(orderId);    }}
static List<OrderItem> DeserializeOrderItems(string orderItemsJson){ return JsonConvert.DeserializeObject<List<OrderItem>>(orderItemsJson);}
class Program{ static void Main(string[] args) { // 根据订单ID读取订单 Order order = ReadOrderFromDatabase(1);
if (order != null) { List<OrderItem> orderItems = DeserializeOrderItems(order.OrderItemsJson); Console.WriteLine("读取到的订单ID: " + order.OrderId); Console.WriteLine("订单项数量: " + orderItems.Count); } else { Console.WriteLine("订单不存在."); } }}

3. 总结

通过将子数据(如订单项)转换为 JSON 字符串并保存到主数据表(如订单)的一个字段中,我们可以简化数据库的设计和操作。虽然这种方法在一定程度上降低了数据的规范化程度,但可以提升开发效率并减少维护成本。在C#中,借助像 Newtonsoft.Json 这样的库,我们可以轻松实现数据的序列化和反序列化操作,从而达到我们的目的。


该文章在 2024/8/19 18:29:39 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2024 ClickSun All Rights Reserved