我有一个这样的课:
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?
答案 0 :(得分:1)
我已经解决了这个问题。问题陈述中的重构类工作正常。
问题不在于泛型类型,如BsonId,还是新类的序列化,而是现有的方法调用。
一系列测试使用方法MongoCollection(TDefaultDocument).FindOneByIdAs
。当重构完成后,这段代码仍然构建,但由于我们不再只找到Guids,它抛出了问题陈述中描述的异常。
我将测试更改为使用MongoCollection(TDefaultDocument).FindOneAs
,使用新的查询检查UID,现在一切正常。