MongoDB C#:ID序列化最佳模式

Dan*_*one 17 c# mongodb

我有一个课程User,我需要在Web服务中使用它们.

然后问题是如果我尝试序列化Id那种类型BsonObjectId,我看到它有一个空属性,有一个空属性,依此类推......

我按顺序编写了这个解决方法,这是一个很好的解决方案吗?

public partial class i_User 
{
    [BsonId(IdGenerator = typeof(BsonObjectIdGenerator))]
    [NonSerialized]
    public BsonObjectId _id;

    public String Id
    {
        get
        {
            return this._id.ToString();
        }
    }   
}   
Run Code Online (Sandbox Code Playgroud)

通过这种方式,我可以保持_Id,BsonObjectId但我在该属性的Web上发送字符串表示Id.

另一种解决方案是使用 StringObjectIdGenerator

public partial class i_User 
{
    [BsonId(IdGenerator = typeof(StringObjectIdGenerator))]
    public String id;
}
Run Code Online (Sandbox Code Playgroud)

但是看到MongoDB将存储string到数据库而不是ObjectId.

在Web服务和/或客户端服务器(Flash + C#)等序列化环境中工作的最佳方法是什么?

Joe*_*ler 98

如果我理解正确,您希望以Id字符串形式访问该属性,但将其Id保存为ObjectIdMongoDB中的.这可以使用BsonRepresentationwith 来完成BsonId.

[BsonId]
[BsonRepresentation(BsonType.ObjectId)]
public string Id { get; set; }
Run Code Online (Sandbox Code Playgroud)

细节可以在这里找到.

  • 很高兴这个答案很有帮助,只是对作者来说似乎没有. (4认同)
  • 谢谢!如果可以,我会投票给你两次;) (3认同)
  • 这有效但不完全是我所希望的.我的愿望是保持我的POCO类不受Mongo的所有依赖.有没有办法在BsonClassMap中实现这一点,将其移动到存储库层? (3认同)

Lyb*_*ker 7

如果你想用类映射来做 - 这是这样做的方法:

BsonClassMap.RegisterClassMap<i_User>(cm =>
{
  cm.AutoMap();
  cm.SetIdMember(cm.GetMemberMap(x => x.Id)
    .SetIdGenerator(StringObjectIdGenerator.Instance));
});
Run Code Online (Sandbox Code Playgroud)