2

我对 mongo c# 驱动程序有一些问题。我有这样的课:

class MongoEntity<T>
{
    public ObjectId Id {get; set;}
    public DateTime CreatedAt { get; set; }
    public DateTime UpdatedAt { get; set; }
    public int Version { get; set; }
    public T Entity { get; set; }
}

在将我的实体序列化到数据库期间,我有这样的文件:

"_id" : "510654cf33d22e1774d5a2a9",
"CreatedAt" : {
    "DateTime" : ISODate("2013-01-28T10:37:02.932Z"),
    "Ticks" : NumberLong("634949662229321756")
 },
 "UpdatedAt" : {
    "DateTime" : ISODate("2013-01-28T10:37:02.932Z"),
    "Ticks" : NumberLong("634949662229321756")
 },
 "Version" : 1,
 "Entity" : {
    "EntityKey" : "tom@gmail.com",
    "Password" : "ICy5YqxZB1uWSwcVLSNLcA==",        
    "Email" : "tom@gmail.com",
    "Name" : "Tom Anderson"
 }

我真正想要的是让我的文档中实体对象的所有属性与 MongoEntity 对象的属性处于同一级别,如下所示:

"_id" : "510654cf33d22e1774d5a2a9",
"CreatedAt" : {
    "DateTime" : ISODate("2013-01-28T10:37:02.932Z"),
    "Ticks" : NumberLong("634949662229321756")
 },
 "UpdatedAt" : {
    "DateTime" : ISODate("2013-01-28T10:37:02.932Z"),
    "Ticks" : NumberLong("634949662229321756")
 },
 "Version" : 1,
 "EntityKey" : "tom@gmail.com",
 "Password" : "ICy5YqxZB1uWSwcVLSNLcA==",        
 "Email" : "tom@gmail.com",
 "Name" : "Tom Anderson"

没有实体嵌入对象。我怎样才能以最简单的方式实现这一点?

PS我真正想要的是驱动程序的一些配置或编写自定义序列化程序,也许是一些动态的解决方法,我不想改变当前的类结构Enteties <-> MongoEntity

谢谢帮助。

4

2 回答 2

4

无法配置内置序列化程序来生成您想要的文档格式(实体字段提升了一级)。

您必须编写一个自定义序列化程序,但这会很困难,因为您要么必须为每个 <T> 编写一个新的序列化程序,要么必须编写一个适用于任何 <T> 的复杂序列化程序。

WiredPrairie 的建议 (Person : MongoEntityBase) 是推荐的解决方案。

于 2013-01-30T15:43:15.847 回答
3

只需使用包含所有必需数据库字段的基本类型的子类。

public class abstract MongoEntityBase
{
    public ObjectId Id {get; set;}
    public DateTime CreatedAt { get; set; }
    public DateTime UpdatedAt { get; set; }
    public int Version { get; set; }
}

然后,使用它:

public class Person : MongoEntityBase
{
    public string Email { get; set; }
    public string Name { get; set; }
}

10gen 提供的 MongoDB C# 驱动程序适用于该模式。

于 2013-01-28T13:12:45.247 回答