我正在设计一个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,这是一个明显的冲突.我只是想知道是否唯一的解决办法是复制和财产复制.