使用C#、带身份验证的ASP.NET Core、MongoDB.Diverer和MongoDB.EntityFrameworkCore处理项目. 我正在try 将一个用户ID以字符串形式存储在购物车中,并使用该数据查找购物车.我设法将商品添加到购物车中,当我转到购物车页面并调用get-方法时,它成功地找到了购物车,没有任何问题.问题是,如果我重新启动应用程序,以用户身份登录并再次转到购物车页面,我会收到BSON Desiralization错误:

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;
        }
    }
}

购物车类,存储在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 ticket条描述了一个相关的问题.

Csharp相关问答推荐

VS Code - C# - dotnet run找不到文件,但我可以打开并编辑它们吗?

在Microsoft XNA框架(MonoGame)中旋转相机

为什么xslWriter不总是按照xslWriterSet中指定的格式格式化该文档?

IComponition.获取IReadOnlyCollection的返回默认属性值

Monty Hall游戏节目模拟给我50/50的结果

HttpContext. RequestAborted当Android APP失go 连接时未取消

如何循环遍历XML文档 node 以使用XSLT存储值

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

限制特定REST API不被访问,但部署代码

使页面内容居中

Rider将.NET安装在哪里

如何在没有前缀和可选后缀的情况下获取Razor Page Handler方法名称?

如何使用.NET6WPF打印车票?

如何在用户在线时限制令牌生成?

如何让两个.NET版本不兼容的项目对话?

WinUI 3中DoubleCollection崩溃应用程序类型的依赖属性

有条件地定义预处理器指令常量

Postgres ENUM类型在第一次运行时对Dapper不可见

如何从Azure函数使用Graph API(SDK 5.35)中的[FindMeetingTimes]

Cmd中的&ping.end()";有时会失败,而";ping";总是有效