LiteDB 支持通过 POCO 类创建强类型文档。当你从 LiteDatabase.GetCollection<T> 获取 LiteCollection 时, <T> 就是你的文档类型。如果 <T> 不是 BsonDocument,LiteDB 内部会将你的类映射为 BsonDocument。为了做到这些,LiteDB 使用了BsonMapper 类:

  1. // 简单的强类型文档
  2. public class Customer
  3. {
  4. public ObjectId CustomerId { get; set; }
  5. public string Name { get; set; }
  6. public DateTime CreateDate { get; set; }
  7. public List<Phone> Phones { get; set; }
  8. public bool IsActive { get; set; }
  9. }
  10. var typedCustomerCollection = db.GetCollection<Customer>("customer");
  11. var schemelessCollection = db.GetCollection("customer"); // <T> 是 BsonDocument

映射约定

BsonMapper.ToDocument() 自动转换类(实例)的每个属性为文档字段,并遵循这些约定:

  • 类必须是 公有的,而且要有一个公有的无参数构造方法
  • 属性必须是公有的
  • 属性可以是只读的或支持读/写的
  • 类必须有一个 Id 属性,<ClassName>Id 属性,或任何使用 [BsonId] 特性修饰或用 fluent api Id 函数映射的属性.
  • 属性可以使用 [BsonIgnore] 修饰,确保不被映射到文档字段
  • 属性可以使用 [BsonField] 修饰,定制文档字段的名称
  • 不允许循环引用
  • 最大深度为 20 层内部(嵌套)类
  • 类字段不会被转换到文档
  • 可以将 BsonMapper 的全局实例 (BsonMapper.Global) 或自定义实例传递给 LiteDatabase 的构造函数,可以单独保存此实例,以避免每次使用数据库时都要重新创建映射。

除基础 BSON 类型外,BsonMapper 还可以将其他 .NET 类型映射为 BSON 数据类型:

.NET 类型 BSON 类型
Int16, UInt16, Byte, SByte Int32
UInt32 , UInt64 Int64
Single Double
Char, Enum String
IList<T> Array
T[] Array
NameValueCollection Document
IDictionary<K,T> Document
任何其他 .NET type Document
  • Nullable<T> 是允许的。如果值是 null,那么 BSON 类型就是 Null,否则映射器会使用 T?
  • 对于 IDictionary<K, T>K 键必须是 String 或简单类型 (可以通过 Convert.ToString(..) 转换为字符串)。

注册自定义类型

可以使用 RegisterType<T> 实例方法注册自己的映射函数。在注册时,你需要提供序列化和反序列化两个函数。

  1. BsonMapper.Global.RegisterType<Uri>
  2. (
  3. serialize: (uri) => uri.AbsoluteUri,
  4. deserialize: (bson) => new Uri(bson.AsString)
  5. );
  • serialize 函数传递 <T> 实例为输入参数,并期待返回 BsonValue
  • deserialize 函数传递 BsonValue 对象为输入参数,并期待返回 <T>
  • RegisterType 通过 BsonDocumentBsonArray 支持复杂对象

映射选项

BsonMapper 类设置:

名称 默认值 描述
SerializeNullValues false 如果值是 null,序列化字段
TrimWhitespace true 在映射到文档前,修剪字符串属性
EmptyStringToNull true 空字符串转换为 null
ResolvePropertyName (s) => s 映射属性名称为字段名称的函数

BsonMapper 提供2个预定义的函数来解析属性名称:UseCamelCase()UseLowerCaseDelimiter('_')

  1. BsonMapper.Global.UseLowerCaseDelimiter('_');
  2. public class Customer
  3. {
  4. public int CustomerId { get; set; }
  5. public string FirstName { get; set; }
  6. [BsonField("customerLastName")]
  7. public string LastName { get; set; }
  8. }
  9. var doc = BsonMapper.Global.ToDocument(new Customer { FirstName = "John", LastName = "Doe" });
  10. var id = doc["_id"].AsInt;
  11. var john = doc["first_name"].AsString;
  12. var doe = doc["customerLastName"].AsString;

AutoId

在 v4 中,AutoId 被上升到引擎级别 (BsonDocument)。有 4 种内置的 auto-id 实现:

  • ObjectId: ObjectId.NewObjectId()
  • Guid: Guid.NewGuid() 方法
  • Int32/Int64: 新集合序列
  • DateTime: DateTime.Now

AutoId 只在插入文档 _id 缺失的情况下使用。在强类型文档中,BsonMapper 从 “empty” (像 Int 中的 0Guid 中的 Guid.Empty) 值中移除了 _id 字段。

Fluent 映射

LiteDB 提供了完整的 fluent API,不用使用特性就可以创建自定义映射。要使用它们,请保证你的领域类没有外部引用。

Fluent API 使用 EntityBuilder 来为你的类添加自定义映射。

  1. var mapper = BsonMapper.Global;
  2. mapper.Entity<MyEntity>()
  3. .Id(x => x.MyCustomKey) // 设置你的文档 ID
  4. .Ignore(x => x.DoNotSerializeThis) // 忽略此属性 (不存储)
  5. .Field(x => x.CustomerName, "cust_name"); // 重命名文档字段