我的 JSON 对象采用这种格式:
[
{
"id": "k002f3d",
"usage": {
"sent": 0,
"recv": 2,
"total": 2
}
},
{
"id": "k641327",
"usage": {
"sent": 0,
"recv": 2,
"total": 2
}
},
{
"id": "k6419b2",
"usage": {
"sent": 872,
"recv": 5912,
"total": 6784
}
}
]
我想将其保存到 SQL Server 表中。我已经定义了我的表来存储该信息,如下所示:
这是我用 C# 编写的 POCO 类:
这是我初始化 POCO 对象的方式:
newClient
是一个对象,我们在添加到SQL Server数据库之前修改一些属性。当执行 db.SaveChanges()
时,会引发对象之间未定义关系或需要在属性之前使用 [NotMapped]
属性的错误。正如您所看到的,Usage
只是对象本身属性的子集。
您介意指导我如何才能将记录保存到数据库吗?我尝试在类 Log 定义中将
[NotMapped]
属性放在属性使用之前,未生成错误,但没有为对象使用的发送、接收和总属性保存数据。
您应该定义外键关系:
public class Usage
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int id { get; set; }
public int? sent { get; set; }
public int? recv { get; set; }
public int? total { get; set; }
}
还在
usageId
实体中添加 Log
属性:
public class Log
{
public string id { get; set; }
public int usageId { get; set; }
public Usage usage { get; set; }
}
然后您的代码应该可以开箱即用,因为所有 ID 现在都应该自动分配。
首先,日志和使用实体中都需要主键来唯一标识每个表中的记录。然后,您需要在实体框架中定义日志和使用实体之间的关系。这涉及设置导航属性和外键以在数据库中的日志和使用表之间建立连接。 Michał Turczyn 在上面的答案中写了如何在代码中实现这一点。
如果您在主键上使用自动增量,则只需在数据库上下文中添加或更新您的 Log 实体。但是,除非使用实体被正确实例化并添加到上下文中,否则这不会自动创建相关的使用实体。
要将 JSON 反序列化为 Log 对象,可以使用 Newtonsoft.Json NuGet 包。确保 JSON 结构与 Log 类匹配,包括相关实体的任何嵌套对象。然后,您可以直接将其反序列化到类中,而不需要复杂的代码。
如果您想从数据库中检索日志及其相关的使用情况,则需要使用 Include 方法来预先加载相关数据。以下是如何执行此操作的示例:
var logWithUsage = context.Log
.Include(log => log.Usage)
.FirstOrDefault(log => log.Id == someLogId);
这将在单个查询中加载日志实体及其关联的使用实体,确保这两个实体在需要时可用。请记住,如果您想访问相关数据而不需要为每个实体进行单独的数据库调用,那么使用 Include 进行提前加载至关重要。
通过定义表示 JSON 结构的模型类、在 DbContext 中配置关系以及在将 JSON 保存到数据库之前反序列化 JSON,使用 Entity Framework Core 将嵌套 JSON 数据保存到 SQL Server 中。