接上篇

忽略某字段或属性

手动构造类映射时您可以简单地通过不将字段或属性添加到类映射。当使用自动映射你需要指定应忽略该字段或属性的方法。可以使用属性编写如下编写:

public class MyClass {

    [BsonIgnore]

    public string SomeProperty { get; set; }

}

或使用初始化代码而不属性:

BsonClassMap.RegisterClassMap<MyClass>(cm => {

    cm.AutoMap();

    cm.UnmapProperty(c => c.SomeProperty);

});

在这种情况下的自动映射将有最初属性自动添加到类映射但UnmapProperty会将其删除。

忽略空值

默认为空的值序列化到 BSON 文档时对应的 BSON字段 Null。替代方法是序列化时忽略掉具有null值的字段或属性。要指定此使用如下属性编写:

public class MyClass {

    [BsonIgnoreIfNull]

    public string SomeProperty { get; set; }

}

或使用初始化代码而不是属性:

BsonClassMap.RegisterClassMap<MyClass>(cm => {

    cm.AutoMap();

    cm.GetMemberMap(c => c.SomeProperty).SetIgnoreIfNull(true);

});

设置默认值

您可以指定一个字段或属性的默认值,如下所示:

public class MyClass {

    [BsonDefaultValue("abc")]

    public string SomeProperty { get; set; }

}

或使用初始化代码而不使用属性:

BsonClassMap.RegisterClassMap<MyClass>(cm => {

    cm.AutoMap();

    cm.GetMemberMap(c => c.SomeProperty).SetDefaultValue("abc");

});

您还可以控制是否将默认值序列化(默认值为是)。不序列化属性默认值做法:

public class MyClass {

    [BsonDefaultValue("abc")]

    [BsonIgnoreIfDefault]

    public string SomeProperty { get; set; }

}

或使用初始化代码而不使用属性:

BsonClassMap.RegisterClassMap<MyClass>(cm => {

    cm.AutoMap();

    cm.GetMemberMap(c => c.SomeProperty)

        .SetDefaultValue("abc")

        .SetIgnoreIfDefault(true);

});

忽略基于ShouldSerializeXyz方法的成员

有时决定是否序列化一个成员比仅仅决定控制或者默认值是否序列化要复杂的多。您可以编写用于确定是否应序列化的方法。通常的方法成员Xyz被命名为ShouldSerializeXyz。如果您按照此命名约定然后自动映射将自动检测到方法和使用它。例如:

public class Employee {

    public ObjectId Id { get; set; }

    [BsonDateTimeOptions(DateOnly = true)]

    public DateTime DateOfBirth { get; set; }

    public bool ShouldSerializeDateOfBirth() {

        return DateOfBirth > new DateTime(, , );

    }

}

或使用初始化代码而不是命名约定:

BsonClassMap.RegisterClassMap<Employee>(cm => {

    cm.AutoMap();

    cm.GetMemberMap(c => c.DateOfBirth).SetShouldSerializeMethod(

        obj => ((Employee) obj).DateOfBirth > new DateTime(, , )

    );

});

确定必须字段

通常情况下,反序列化程序不关心将要被反序列化的文档是否不包含匹配的元素。不具有匹配元素的成员只是简单的获得分配给它们的默认值。

如果你想要使文档中的元素必须需要,您可以像这样标记单个字段或属性:

public class MyClass {

    public ObjectId Id { get; set; }

    [BsonRequired]

    public string X { get; set; }

}

改为使用初始化代码的方法:

BsonClassMap.RegisterClassMap<MyClass>(cm => {

    cm.AutoMap();

    cm.GetMemberMap(c => c.X).SetIsRequired(true);

});

警告:

在反序列化时将会抛出一个异常,这种状态并不适用于序列化.

指定序列化程序

有时需要的序列化程序,而不是使用Bson库。可以通过下面几种方法来达到此目的:

public class MyClass {

    public ObjectId Id { get; set; }

    [BsonSerializer(typeof(MyCustomStringSerializer))]

    public string X { get; set; }

}

改为使用初始化代码的方式:

BsonClassMap.RegisterClassMap<MyClass>(cm => {

    cm.AutoMap();

    cm.GetMemberMap(c => c.X).SetSerializer(new MyCustomStringSerializer());

});

待续。。。。。

MongoDB学习(翻译7)的更多相关文章

  1. MongoDB学习3

    MongoDB学习(翻译3)   支持的where字句(比较多,今天先写一部分) 本节介绍支持的where字句 正如前面提到的,不是所有的C#表达式都支持where子句.您可以以此文为指导,或者你可以 ...

  2. MongoDB学习2

    MongoDB学习(翻译2) C#驱动之LINQ教程 介绍 本教程涵盖了1.8发布版本对linq查询的支持. 开始本教程之前,你应该至少阅读下C#驱动教程关于C#驱动的介绍 快速开始 首先,添加下面命 ...

  3. MongoDB学习笔记二- Mongoose

    MongoDB学习笔记二 Mongoose Mongoose 简介 之前我们都是通过shell来完成对数据库的各种操作, 在开发中大部分时候我们都需要通过程序来完成对数据库的操作 而Mongoose就 ...

  4. MongoDB学习笔记系列

    回到占占推荐博客索引 该来的总会来的,Ef,Redis,MVC甚至Sqlserver都有了自己的系列,MongoDB没有理由不去整理一下,这个系列都是平时在项目开发时总结出来的,希望可以为各位一些帮助 ...

  5. MongoDB学习笔记—Linux下搭建MongoDB环境

    1.MongoDB简单说明 a MongoDB是由C++语言编写的一个基于分布式文件存储的开源数据库系统,它的目的在于为WEB应用提供可扩展的高性能数据存储解决方案. b MongoDB是一个介于关系 ...

  6. Mongodb学习笔记一(Mongodb环境配置)

    Mongodb学习 说明: MongoDB由databases组成,database由collections组成,collection由documents组成,document由fileds组成.Mo ...

  7. MongoDB学习记录

    一.操作符 "$lt" :"<""$lte" :"<=""$gt" :"> ...

  8. PHP操作MongoDB学习笔记

    <?php/*** PHP操作MongoDB学习笔记*///*************************//**   连接MongoDB数据库  **////*************** ...

  9. MongoDB学习:(二)MongoDB简单使用

    MongoDB学习:(二)MongoDB简单使用 MongoDB使用: 执行mongodb的操作之前,我们需要运行命令,来进入操作命令界面 >mongo 提示该错误,说明我们系统缺少一个补丁,该 ...

  10. MongoDB学习:(一)MongoDB安装

    MongoDB学习:(一)MongoDB安装 MongoDB介绍:     直接百科了: MongoDB安装: 1:下载安装: MongoDB安装:https://www.mongodb.com/do ...

随机推荐

  1. Android学习----异常(2):Please ensure that adb is correctly located at &#39; ... &#39;

    打开任务管理器,在后台进程中找到 kadb,结束这个进程,重新启动eclipse.

  2. 熊猫猪新系统測试之三:iOS 8.0.2

    本来本猫要等到8.1版本号出来后再做測试的,结果等来等去就是迟迟不推送更新呀!说好10月20号的iOS 8.1呢?为了一鼓作气写完,就先不等了.先拿手头的iOS 8.0.2系统做一下測试吧! 8.x系 ...

  3. ArcEngine载入中SDE问题栅格数据

    当直接加载矢量数据到IFeatureWorkspace接口可,但是,在装载门格当要传送的数据IRasterWorkspaceEx接口. 效果如下面的,对可以被添加到双击Globe在. watermar ...

  4. linux c ping 实现

    用c语言实现的linux中的ping命令 #include <stdio.h> #include <signal.h> #include <arpa/inet.h> ...

  5. C语言编写Windows服务程序

    原文:C语言编写Windows服务程序 #include <Windows.h> #include <stdio.h> #define SLEEP_TIME 5000 // 间 ...

  6. c# 播放器 支持所有格式

    原文:c# 播放器 支持所有格式 ---恢复内容开始--- 直接上代码 internal static class LibVlcAPI { internal struct PointerToArray ...

  7. [译]ava 设计模式之享元

    (文章翻译自Java Design Pattern: Flyweight) 享元模式用于最小化内存开销.它做的就是使用其他相似的对象尽可能多的分享数据. 1.享元模式类图 2.享元模式Java代码 / ...

  8. SSIS中执行SQL任务组件参数传递的问题

    原文:SSIS中执行SQL任务组件参数传递的问题 症状: 执行SQL任务,传递参数到子查询中,执行报错. 错误: 失败,错误如下:"无法从使用 sub-select 查询的 SQL 语句中派 ...

  9. 功能和形式的反思sql声明 一个

    日前必须使用sql语句来查询数据库 但每次你不想写一个数据库中读取所以查了下反射 我想用反映一个实体的所有属性,然后,基于属性的查询和分配值 首先,须要一个实体类才干反射出数据库相应的字段, 可是開始 ...

  10. sqlclr返回数据集案例

    ----------------------------------------------返回一张表,但只有一条数据,最后一次设置的. [Microsoft.SqlServer.Server.Sql ...