C#MongoDB驱动程序:我可以为BsonId使用泛型类型吗?

C#MongoDB驱动程序:我可以为BsonId使用泛型类型吗?,c#,mongodb,mongodb-.net-driver,bson,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... } } publi

我上过这样的课:

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...
    }
}
这最近重构了一些东西。上面的代码有一系列的测试,这些测试都是在重构之前通过的。现在我有一门课是这样的:

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
,因此我似乎可以拥有一个具有泛型类型的BsonId。但是
MyClass
的测试失败,只有一个例外 “NewIdType无法映射到BsonValue”的


是我遗漏了一些简单的东西,还是我只是不允许有这样一个泛型类型的BsonId?

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

问题不在于作为BsonId的泛型类型,也不在于新类的序列化,而在于现有的方法调用

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


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

很有趣。可能只是一个从未遇到过的用例。请在jira.mongodb.com的CSHARP项目下提交一个bug。我在生产中使用了泛型类型基类,从来没有遇到过问题。把OP的例子放进去就行了。您是否可能在同一个集合中混淆了旧文档和新文档,以致于您试图在某个时刻从具有
NewIdType
-id的数据库文档中读取和
int
?因此,这个问题最终得到解决,@mnemosyn是正确的,一切正常。问题出在对
MongoCollection(TDefaultDocument).FindOneByIdAs
的调用中。由于我不再只是查找guid,我需要将其更改为使用FindOneAs,并使用查询?从技术上讲,这并没有什么错,但正是@mnemosyn的评论(关于一切对他来说都很好)让我停止调查这条路径,并开始检查我在哪里使用它。可能对某人还是有用的?我建议你对自己的问题发表一个答案,在那里简要描述解决方案,这将有助于将来的参考。