c# - 在 MongoDb + C# 中反序列化没有默认构造函数的对象

标签 c# mongodb mongodb-.net-driver bson

考虑两个类:

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 属性,但它只能接受常量表达式

我想做的是从配置文件中加载字段的默认值,同时从 MongoDb 检索对象的其余部分!?当然,用最少的努力。

[更新]

我也对此进行了测试,结果相同:

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再次为零!

最佳答案

我成功地实现了这样的目标:

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接口(interface)提供了两个方法BeginInit和EndInit,分别在反序列化过程之前和之后调用。它们是设置默认值的最佳位置。

关于c# - 在 MongoDb + C# 中反序列化没有默认构造函数的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19608761/

相关文章:

mongodb - 查询 MongoDB 以获取数组中的多个 ObjectID

javascript - 使用 mongoose 保存数组数据的更简洁的代码

c# - MongoDB C# 驱动程序 - 忽略绑定(bind)字段

c# - Roslyn 在 {SomeSyntax}.Type 下获取详细信息

c# - 删除在 ASP.NET MVC 中经过身份验证的用户

c# - 为什么在这个测试中数组比字典快

c# - 连接字符串中的 Mongodb autoConnectRetry 选项不适用于 C# 驱动程序

c# - Linq to XML 拉回存在于不同级别的属性

node.js - 设置选择 : false to subdocuments array at mongoose

c# - MongoDb C# 驱动程序 - 基于 "candidate"键更新插入许多内容