.NET WebAPI对接MongoDB时实体多属性共享同一GUID实现方案
问题原因
你之前的构造函数方案不生效,核心是两个点:
- 你定义的
Id是纯get只读属性,主流JSON序列化器(System.Text.Json、Newtonsoft.Json)默认配置下,要么通过反射直接生成未执行构造函数的空实例,要么无法在对象初始化完成后给无setter的只读属性赋值,导致构造函数里生成的GUID要么丢失,要么和后续反序列化传入的Id值冲突。 - 静态GUID方案全局共享同一个值,自然无法满足每次新建对象生成新值的需求。
可行实现方案
最稳妥的实现是把两个属性的绑定逻辑直接写在Id的赋值入口,从机制上保证两个值永远一致,不需要依赖构造函数执行时机,同时兼容序列化/反序列化场景。
实体类写法
using System; using MongoDB.Bson.Serialization.Attributes; using System.Text.Json.Serialization; // 若使用Newtonsoft.Json,替换为对应命名空间下的JsonIgnore特性即可 public class UserObject { private string _id; [BsonId] public string Id { get => _id; // C# 9及以上版本用init,保证对象初始化后主键不可修改;低版本可替换为private set init { _id = value; // Id赋值时自动同步给UserId,保证两个值完全一致 UserId = value; } } [JsonIgnore] public string UserId { get; set; } public UserObject() { // 手动新建对象时,自动生成同一个GUID赋值给两个属性 string newGuid = Guid.NewGuid().ToString(); _id = newGuid; UserId = newGuid; } }
方案适配场景
- 手动
new UserObject()创建实例时:自动生成全新的同一份GUID给Id和UserId,符合新建对象的需求 - API接口接收JSON反序列化时:如果请求体带了
Id值,反序列化赋值Id的过程会自动同步UserId为相同值,不会额外生成新GUID;UserId因为加了[JsonIgnore],完全不会受前端传参影响 - MongoDB读写场景:Bson序列化/反序列化给
Id(即MongoDB主键_id)赋值时,同样会自动同步UserId,不会出现值不一致的问题
内容的提问来源于stack exchange,提问作者Danzon2504
相关产品推荐
相关产品推荐

