C# MongoDB 驱动程序 : Can I use generic type for BsonId?

标签 c# mongodb mongodb-.net-driver bson

我有这样一个类:

public class MyClass
{
    [BsonId]
    public Guid MyId { get; private set; }
    // some other properties...

    [BsonConstructor]
    public MyClass(Guid id)
    {
        MyId = id;
        // set some other properties...
    }
}

这最近重构了一些东西。上面的代码有一系列的测试覆盖它,在重构之前都通过了。现在我有这样一个类:

public class MyClass<T>
{
    [BsonId]
    public T MyId { get; private set; }
    // some other properties...

    [BsonConstructor]
    public MyClass(T id)
    {
        MyId = id;
        // set some other properties...
    }
}

希望旧代码可以像以前一样工作,使用MyClass<Guid>并进行序列化,以便每个文档都有一个像 Guid 一样的 _id,并且新代码可以使用一个新对象, 喜欢MyClass<NewIdType>并序列化为复合键,如 _id: { guid, integer }。新的 id 类如下所示:

public class NewIdType
{
    public Guid NewId { get; set; }
    public int NewIdRank { get; set; }
}

我不太了解序列化的工作原理。我见过很多例子(没有一个完全像这样......)并且经历了 Serialization Tutorial , 没有成功。

就其值(value)而言,旧的测试集将通过 MyClass<Guid> ,所以我似乎被允许拥有一个具有泛型类型的 BsonId。但是 MyClass<NewIdType> 的测试失败了有一个异常(exception) “NewIdType 无法映射到 BsonValue”。

我是否遗漏了一些简单的东西,或者我只是不允许拥有像这样的通用类型的 BsonId?

最佳答案

我已经解决了这个问题。问题陈述中的重构类工作正常。

问题不在于像 BsonId 这样的泛型类型,也不在于新类的序列化,而在于现有的方法调用。

一系列测试使用了方法MongoCollection(TDefaultDocument).FindOneByIdAs。重构完成后,这段代码仍然构建,但由于我们不再只找到 Guid,它抛出了问题陈述中描述的异常。

我将测试更改为使用 MongoCollection(TDefaultDocument).FindOneAs,使用新的查询来检查 UID,现在一切都按预期工作。

关于C# MongoDB 驱动程序 : Can I use generic type for BsonId?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28463384/

相关文章:

c# - MongoDB:C# 还是 JavaScript?

c# - MongoDB C# 驱动程序 - 将集合序列化为接口(interface)

c# - 在 C# 中捕获声音输出

c# - moq 模拟 buffer[] 参数

mongodb - NestJS + Mongoose + GraphQL : "populate" not working

node.js - nodejs + mongoose - 如何在nodejs中使用forEach

c# - MongoDb 连接到副本集主要问题 C#

c# - 在不使用用户 ID 和密码的情况下对 Azure SQL 数据库进行身份验证

c# - MVC3 范围属性 - 不允许值为零

node.js - mongodb聚合框架嵌套数组减法表达式