這個方法有些地方用著還是挺省事,優點,缺點明顯。在現代企業應用程序開發中,處理復雜的主從數據結構是常見的需求。例如,在訂單管理系統中,一個訂單(主數據)會有多個訂單項(子數據)。傳統的關系型數據庫可能需要多表關聯和復雜的事務處理,而通過將子數據保存為JSON字符串,可以簡化這些繁瑣的操作。本文將詳細介紹如何在C#中實現這個過程。
1. 背景介紹
主數據與子數據
主數據與子數據的關系可以通過一個簡單的實例來描述。假設我們有一個訂單表(Order)和訂單項表(OrderItem)。
優化思路
通過將 OrderItem
轉換為 JSON 字符串,并將其存儲到 Order
表中的一個字段中,可以簡化數據結構和操作復雜性。雖然這種方法降低了數據的規范化程度,但在很多場景下,可以提高開發和維護效率。
2. 示例實現
2.1 創建實體類
我們將創建兩個實體類 Order
和 OrderItem
,并在 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.EntityFrameworkCore
Install-Package Microsoft.EntityFrameworkCore.Sqlite
Install-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 編輯過