微軟程式碼範例中的一個Bug 處理Mongodb的Bson中ObjectId反序列化異常
https://docs.microsoft.com/zh-cn/aspnet/core/tutorials/first-mongo-app?view=aspnetcore-2.2&tabs=visual-studio-code
Dotnet core 2.1已推出有一段時間,asp.net提供了一段關於Webapi的範例,是使用Dotnet Core+Mongodb搭建Webapi,範例說可以完成Mongodb資料CRUD操作。 一切順利,按照範例搭建完成,驗證建立、查詢、刪除操作都正常,Update不正常。 報的是ObjectId型別轉換異常,直接將Get方法返回的資料貼回去都會報這個異常。 由於Dotnet core 還是新事物,網上資料少,沒有找到有價值的方案,所以打算自己嘗試。
由於是物件Id序列化的問題:
1、客戶端,Update的時候json不傳入Id,沒有報型別轉換異常,但Mongodb報錯。
2、所以想著直接用Url傳Id進入方法。(可行)
3、修改BookService在更新Mongodb的之前,將Id轉換為ObjectId然後不知到物件再更新,book.Id=new ObjectId(string);(可行) 到這一步已經個可以Update資料到Mongodb了,但是想將事情做得完美一點,畢竟傳輸的Json沒有ID,總覺得遺漏了什麼。
4、改造Model,將ObjectId的屬性增加一個標籤[JsonIgnore].(傳到客戶端的Id都沒有了) 5、Model增加一個xxxId getter setter
1 [BsonIgnore] 2 public string BookId { 3 get{ 4 return Id.ToString(); 5 } 6 7 set{ 8 Id=new ObjectId(value); 9 } 10 }
OK. 完美。
然後,在百度上 以BsonIgnore關鍵字搜尋一下,原來還有很多人處理按這種方法處理過同樣的問題。