我有这样一个类:
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/