使用 C#、带有身份验证的 ASP.NET Core、MongoDB.Driver 和 MongoDB.EntityframeworkCore 来处理项目。 我试图将用户 ID 作为字符串存储在购物车中,并使用该数据查找购物车。我设法将商品添加到购物车,当我转到购物车页面并调用 get 方法时,它成功地找到了购物车,没有任何问题。问题是,如果我重新启动应用程序,使用用户登录并再次转到购物车页面,我会收到 Bson desalization 错误:
BsonSerializationException:未知的鉴别器值“List`1”。
这是当我在重新启动应用程序后收到反序列化错误时调用 FirstOrDefaultAsync 方法时。
GetItems 代码:
public async Task<CartDto> GetItems()
{
var user = signInManager.Context.User.Identity;
if (user is not null && user.IsAuthenticated)
{
var identity = System.Security.Claims.ClaimTypes.NameIdentifier;
var userId = signInManager.Context.User.FindFirst(identity)?.Value;
var userCart = await context.Cart.FirstOrDefaultAsync(c => c.UserId == userId);
if (userCart is not null)
{
CartDto cartDto = new()
{
Id = userCart.Id.ToString(),
UserId = userCart.UserId,
Products = userCart.Products
};
return cartDto;
}
}
}
Cart 类,存储在 MongoDB 中:
[Collection("Cart")]
public class Cart
{
public ObjectId Id { get; set; }
public required string UserId { get; set; }
public List<string> Products { get; set; }
}
从版本 7.0.0-preview.1 开始,MongoDB 实体框架提供程序似乎不正确地序列化
List<T>
,因此列表项以以下形式序列化,而不是序列化纯字符串:
{
// ...
"Products": {
"_t": "List`1",
"_v": [
"Test1",
"Test2"
]
}
}
反序列化时,提供程序期望数组中包含纯字符串值,但遇到
_t
类型鉴别器,从而引发错误。
此Jira 票证描述了相关问题。