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

时间:2015-02-11 20:00:37

标签: 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,没有成功。

对于它的价值,旧的测试集合将通过MyClass<Guid>,所以似乎我可以使用泛型类型的BsonId。但MyClass<NewIdType>的测试失败,但有例外 “NewIdType无法映射到BsonValue”。

我是否遗漏了一些简单的内容,或者我只是不允许这样的泛型类型的BsonId?

1 个答案:

答案 0 :(得分:1)

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

问题不在于泛型类型,如BsonId,还是新类的序列化,而是现有的方法调用。

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

我将测试更改为使用MongoCollection(TDefaultDocument).FindOneAs,使用新的查询检查UID,现在一切正常。