考虑两个类:
public class Entity
{
public ObjectId Id { get; set; }
public E2 e = new E2(ConfigClass.SomeStaticMethod());
}
public class E2
{
[BsonIgnore]
public int counter = 5;
public DateTime last_update { get; set; }
public E2(int c)
{
counter = c;
}
}
我将存储然后从类似的MongoDb中检索类型为Entity
的对象(假设集合为空):
var collection = database.GetCollection<Entity>("temp");
collection.Save<Entity>(new Entity());
var list = collection.FindAs<Entity>(new QueryDocument());
var ent = list.Single();
无论ConfigClass.SomeStaticMethod()
返回什么,counter
字段都将为零(整数的默认值)。但是,如果我向E2
类添加默认构造函数,则counter
将为5
。
这意味着MongoDb的C#驱动程序在调用非默认构造函数时遇到了问题(完全可以理解)。我知道在BSON库中定义了BsonDefaultValue
属性,但它只能接受constant expressions
。
我要做的是从配置文件中加载字段的默认值,同时从MongoDb中检索其余的对象!?当然,努力最少。
[UPDATE]
我也用相同的结果对此进行了测试:
public class Entity
{
public ObjectId Id { get; set; }
public E2 e = new E2();
public Entity()
{
e.counter = ConfigClass.SomeStaticMethod();
}
}
public class E2
{
[BsonIgnore]
public int counter = 5;
public DateTime last_update { get; set; }
}
运行此代码会导致counter
再次为零!
答案 0 :(得分:4)
我设法完成了这样的事情:
public class Entity
{
public ObjectId Id { get; set; }
public E2 e = new E2();
}
public class E2 : ISupportInitialize
{
[BsonIgnore]
public int counter = 5;
public DateTime last_update { get; set; }
public void BeginInit()
{
}
public void EndInit()
{
counter = ConfigClass.SomeStaticMethod();
}
}
ISupportInitialize
接口带有两个BeginInit
和EndInit
方法,它们在反序列化过程之前和之后调用。它们是设置默认值的最佳位置。