MongoDB学习(翻译6)
接上篇。。。。
字段或属性层次的序列化选项
有许多种让你控制序列化的方式,上一节通过约定方法来控制序列化,你也可以通过代码配置或者成员映射或者使用特性来控制你的序列化,下面说道的序列化的各个方面,我们都会展示两种方式。
Opt-In
大多数类会使他们的属性自动映射,有一些情况下,不会出现这种情形,例如,如果你的属性是只读的,那么它便不会加入到自动映射的队列中,为了包含该只读属性,你可以使用BsonElementAttribute
public class MyClass {
private readonly string _someProperty;
[BsonElement]
public string SomeProperty
{
get { return _someProperty; }
}
}
也可以不使用特性而是下面的初始化代码实现同样的结果:
BsonClassMap.RegisterClassMap<MyClass>(cm => {
cm.MapProperty(c => c.SomeProperty);
});
注意:
当只读属性被序列化后,它的值会持久化到数据库,并不会被读出来
Element name元素名称
指定元素名称使用特性BsonElement:
public class MyClass {
[BsonElement("sp")]
public string SomeProperty { get; set; }
}
也可以不使用特性而是下面的初始化代码实现同样的结果:
BsonClassMap.RegisterClassMap<MyClass>(cm => {
cm.AutoMap();
cm.GetMemberMap(c => c.SomeProperty).SetElementName("sp");
});
注意:我们是第一次对类进行了自动映射,然后覆写类中某一个块,如果我们不先调用AutoMap 那么GetMemberMap就会因为没有成员映射而抛出异常。
Element Order
如果你想精确控制BSON文档中的元素的顺序,你可以使用BsonElement特性的Order 命名参数:
public class MyClass {
[BsonElement("sp", Order = )]
public string SomeProperty { get; set; }
}
或者使用下面代码来替代特性方式:
BsonClassMap.RegisterClassMap<MyClass>(cm => {
cm.AutoMap();
cm.GetMemberMap(c => c.SomeProperty).SetElementName("sp").SetOrder();
});
任何显示使用Order 的字段或者属性序列化会发生在不用Order 之前
设置ID字段或属性
设置类的哪一列是ID列或者属性你可以这样做:
public class MyClass {
[BsonId]
public string SomeProperty { get; set; }
}
或者使用下面代码来替代特性方式:
BsonClassMap.RegisterClassMap<MyClass>(cm => {
cm.AutoMap();
cm.SetIdMember(cm.GetMemberMap(c => c.SomeProperty));
});
当不适用自动映射时,你也可以按照下面的方式来指定ID字段或者属性:
BsonClassMap.RegisterClassMap<MyClass>(cm => {
cm.MapIdProperty(c => c.SomeProperty);
// mappings for other fields and properties
});
注意:
默认的约定,会发现公共属性或字段名称“Id”, “id”, or “_id”,所以没有必要为这个字段使用显示的特性或者映射
为id字段或属性选择IdGenerator(生成器)
当插入一个文档时,C#驱动会检查是否给Id成员赋值,如果没有,它会给这个字段或属性生成一个唯一的值,由于Id成员可以是任何类型,所以驱动需要一个匹配的IdGenerator 的帮助来检查这个是否已经赋值,如果没会生成值。驱动内置了一下几个IdGenerators :
- BsonObjectIdGenerator
- CombGuidGenerator
- GuidGenerator
- NullIdChecker
- ObjectIdGenerator
- StringObjectIdGenerator
- ZeroIdChecker<T>
有些IdGenerators 用于产生某些通用的Id类型
- BsonObjectIdGenerator 用于 BsonObjectId
- GuidGenerator 用于 Guid
- ObjectIdGenerator用于 ObjectId
- StringObjectIdGenerator 用于字符串类型的 ObjectId
可以这样为你的Id字段或属性选择IdGenerator :
public class MyClass {
[BsonId(IdGenerator = typeof(CombGuidGenerator))]
public Guid Id { get; set; }
}
或者使用下面代码来替代特性方式:
BsonClassMap.RegisterClassMap<MyClass>(cm => {
cm.AutoMap();
cm.IdMemberMap.SetIdGenerator(CombGuidGenerator.Instance);
});
如果说所有的Guids你都用CombGuidGenerator 生成,你可以这样写:
BsonSerializer.RegisterIdGenerator(
typeof(Guid),
CombGuidGenerator.Instance
);
NullIdChecker 和ZeroIdChecker<T> Id生成器是用于当您不存在一个IdGenerator 为您生成Id是但你想强制Id不为null或者0.
BsonSerializer.UseNullIdChecker = true; // used for reference types BsonSerializer.UseZeroIdChecker = true; // used for value types
最近有点忙了,一点一点来吧,今天先这么多,明天继续。。。
MongoDB学习(翻译6)的更多相关文章
- MongoDB学习3
MongoDB学习(翻译3) 支持的where字句(比较多,今天先写一部分) 本节介绍支持的where字句 正如前面提到的,不是所有的C#表达式都支持where子句.您可以以此文为指导,或者你可以 ...
- MongoDB学习2
MongoDB学习(翻译2) C#驱动之LINQ教程 介绍 本教程涵盖了1.8发布版本对linq查询的支持. 开始本教程之前,你应该至少阅读下C#驱动教程关于C#驱动的介绍 快速开始 首先,添加下面命 ...
- MongoDB学习笔记二- Mongoose
MongoDB学习笔记二 Mongoose Mongoose 简介 之前我们都是通过shell来完成对数据库的各种操作, 在开发中大部分时候我们都需要通过程序来完成对数据库的操作 而Mongoose就 ...
- MongoDB学习笔记系列
回到占占推荐博客索引 该来的总会来的,Ef,Redis,MVC甚至Sqlserver都有了自己的系列,MongoDB没有理由不去整理一下,这个系列都是平时在项目开发时总结出来的,希望可以为各位一些帮助 ...
- MongoDB学习笔记—Linux下搭建MongoDB环境
1.MongoDB简单说明 a MongoDB是由C++语言编写的一个基于分布式文件存储的开源数据库系统,它的目的在于为WEB应用提供可扩展的高性能数据存储解决方案. b MongoDB是一个介于关系 ...
- Mongodb学习笔记一(Mongodb环境配置)
Mongodb学习 说明: MongoDB由databases组成,database由collections组成,collection由documents组成,document由fileds组成.Mo ...
- MongoDB学习记录
一.操作符 "$lt" :"<""$lte" :"<=""$gt" :"> ...
- PHP操作MongoDB学习笔记
<?php/*** PHP操作MongoDB学习笔记*///*************************//** 连接MongoDB数据库 **////*************** ...
- MongoDB学习:(二)MongoDB简单使用
MongoDB学习:(二)MongoDB简单使用 MongoDB使用: 执行mongodb的操作之前,我们需要运行命令,来进入操作命令界面 >mongo 提示该错误,说明我们系统缺少一个补丁,该 ...
- MongoDB学习:(一)MongoDB安装
MongoDB学习:(一)MongoDB安装 MongoDB介绍: 直接百科了: MongoDB安装: 1:下载安装: MongoDB安装:https://www.mongodb.com/do ...
随机推荐
- MAC使用小技巧(二)
一.Safari-->广告数量不足 --原因:DNS被拦截,被恶意推送广告. ----------------------------- [ 思路 ] 修改hosts文件 $ cd /etc $ ...
- centos5.8本地安装yum资源,安装软件包
首先 [root@mode media]# cd /etc/yum.repos.d/ [root@mode yum.repos.d]# ll total 16 -rw-r--r-- 1 root ro ...
- 解决tomcat占用8080端口
怎么解决tomcat占用8080端口问题图文教程 怎么解决tomcat占用8080端口问题 相信很多朋友都遇到过这样的问题吧,tomcat死机了,重启eclipse之后,发现 Se ...
- request的setAttribute()怎么用的?
request.setAttribute()怎么用的?JSP1代码String [] test=new String[2];test[0]="1";test[1]="2& ...
- 在Magento产品页面的使用jqZoom
Magento在产品页面提供了一个简单的图片放大功能,不是非常好,假设考虑使用放大镜来使用户查看产品的大图.能够考虑使用基于jQuery的插件,jqZoom便是一款优秀的放大镜插件.以下将介绍如何把j ...
- MySQL存储引擎差异化实验
本篇把MySQL最常用的存储引擎给大家做一个介绍,然后通过插入.修改和并发实验来了解和验证一下它们之间的一些差异. 一.MySQL存储引擎简介 存储引擎在MySQL结构里占据核心的位置,是上层抽象接口 ...
- .net下二进制序列化的格式分析[转]
.net下二进制序列化的格式分析[转] -- 综合应用 (http://www.Host01.Com/article/Net/00020003/) --- .net下二进制序列化的格式分析 (http ...
- Cts分析框架(4)-添加任务
Debug watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaXRmb290YmFsbA==/font/5a6L5L2T/fontsize/400/fill/ ...
- 快速构建Windows 8风格应用11-语义缩放
原文:快速构建Windows 8风格应用11-语义缩放 本篇博文主要介绍为什么需要语义缩放.什么是语义缩放.如何构建语义缩放. 为什么需要语义缩放 如果用过Windows 8系统的开发者都知道在Win ...
- 通过 C# 代码操作 Google 日历
原文:通过 C# 代码操作 Google 日历 本文主题 借助 Google .NET APIs Client Library,通过 C# 代码在 Google 日历中创建会议邀请. 本文背景 最近, ...