Mongo c#驱动程序为泛型类型自定义序列化

时间:2013-01-28 10:54:42

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

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

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"

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

P.S。我真正需要的是一些驱动程序配置或编写自定义序列化程序,也许是动态的一些解决方法,我不想改变当前的类结构Enteties&lt; - &gt; MongoEntity

请求帮助。

2 个答案:

答案 0 :(得分:4)

无法配置内置序列化程序以生成所需的文档格式(实体字段提升一级)。

您必须编写自定义序列化程序,但这很困难,因为您必须为每个&lt; T&gt;编写新的序列化程序,或者您必须编写适用于任何&lt; T&gt;的复杂序列化程序。

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

答案 1 :(得分: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#驱动程序可以正常使用该模式。