我正在设计一个API,其中包含一组相对简单的模型和关系.我找到的许多文档和示例似乎都建议设计一个既充当DB模型又充当JSON模型的模型.起初,这似乎是减少代码量的理想 Select .然而,在简单的关系中,似乎很难让单个模型同时满足DB模型和JSON模型的需求.我并不反对复制,但这似乎会导致重复的实地复制,我相信有更好的方法.

考虑一个轨道表,每个轨道都包含一个轨道点列表.

public class Track
{
   [Key]
   [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
   public long Id { get; set; }

   public ICollection<TrackPoint> Points { get; }
}

public class TrackPoint
{
   [Key]
   [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
   public long Id { get; set; }

   public long TrackId { get; set; }
   public required virtual Track Track { get; set; }

   public required double Latitude { get; set; }
   public required double Longitude { get; set; }
}

这种设计足以创建所需的数据库表.但是,在发布要创建的跟踪点列表时,我不需要也不想在每个跟踪点内提供跟踪数据.我有一个在端点定义的轨道id:/track/44/points.然而,由于DB定义需要跟踪完整性约束,所以在没有定义Track属性的情况下发布JSON内容时,控制器会抱怨.

{
   points: [{
      latitude: 1.0,
      longitude: 1.0
   }]
}

显然,我可以创建一个新的TrackPointDTO模型,其中删除了TrackPoint DB关系字段(或者使用继承来避免重新定义相同的字段),但是我的控制器必须将所有字段从反序列化的TrackPointDTO对象复制到新创建的TrackPoint对象中.

最后,我想知道是否有一种更清晰的方法来保持在支持DB和约束定义以及JSON传输定义的单一模型中.我认识到问题是,我既希望DB模型需要Track属性,又希望JSON模型允许它为null,这是一个明显的冲突.我只是想知道是否唯一的解决办法是复制和财产复制.

推荐答案

您应该有单独的实体模型和表示模型,因为它们服务于不同的目的,并且您希望完全控制用户看到的内容和DB中的内容.而不是显式复制控制器中的属性,使用AutoMapper,那么这是非常干净的ie.

var trackPointToCreate = _mapper.Map<Trackpoint>(createTrackpointDto);

var createdTrackpoint = await _trackpointService.CreateTrackpointAsync(trackPointToCreate);

return Ok(_mapper.Map<TrackPointDto>(createdTrackpoint))

使用这些单独的模型,您甚至可以更改属性的名称,添加验证属性等(只要记住用AutoMapper定义映射这些不同的属性名称).

AutoMapper教程:www.example.com

Csharp相关问答推荐

List T.AddRange在传递ConcurrentDictionary作为参数时引发ArgumentExcellent

如何在Visual Studio代码中更改大括号模式{},用于C#语言

使用命令初始化可绑定属性

为什么将鼠标悬停在DateTimeOffset上只显示Hour值?

在C#中,将两个哈希集连接在一起的时间复杂度是多少?

从VS调试器而不是测试资源管理器运行的调试NUnitDotNet测试

具有可空类型的C#NOTNULL约束具有意外行为

正在try 从Blazor中的API读取JSON

在两个已具有一对多关系的表之间添加另一个一对多关系

BFF到具有AAD/Entra ID B2C的内部API(.NET/ASP.NET核心/标识.Web)

在C#中,是否有与变量DISARD对应的C++类似功能?

如何在同一成员上组合[JsonPropertyName]和[ObservableProperty]?

Azure Functions v4中的Serilog控制台主题

JsonPath在Newtonsoft.Json';S实现中的赋值

我的命名管道在第一次连接后工作正常,但后来我得到了System.ObjectDisposedException:无法访问关闭的管道

如何在一次数据库调用中为ASP.NET核心身份用户加载角色

为什么在使用JsonDerivedType序列化泛型时缺少$type?

NETSDK1201:对于面向.NET 8.0和更高版本的项目,默认情况下,指定RUNTIME标识符将不再生成自包含的应用程序

在C#和HttpClient中使用REST API

避免在特定区域中设置Visual Studio代码的自动格式