MongoDB C#如何为元素内的嵌套元素生成对象ID

时间:2015-11-03 11:31:43

标签: c# mongodb

我正在寻找一种使用MongoDB c#驱动程序为嵌套内部属性生成ObjectId的方法。不幸的是,它不会为内部集合生成id。我正在寻找一种自动生成Id的方法

实体类

public class BigTree : IEntity
{
    public string Id { get; set; }
    public string ProjectId { get; set; }
    public string Name { get; set; }
    public string Revision { get; set; }
    public ICollection<Dejavu> Dejavu { get; set; }
}

public interface IEntity
{
    string Id { get; set; }
}

public class Dejavu : IEntity
{
    public Dejavu()
    {
        Delgo = new Delgo();
    }

    public string Id { get; set; }
    public string FieldName { get; set; }
    public Delgo Delgo { get; set; }
}

Mapper类

public static void MapAllTheClasses ()
{
    MapEntity<BigTree>();
    MapEntity<Delgo>();
    MapEntity<Dejavu>();     
}

public static void MapEntity<TEntity>() where TEntity : IEntity
{
    BsonClassMap.RegisterClassMap<TEntity>( e =>
     {
         e.AutoMap();
         e.MapIdProperty( u => u.Id )
                  .SetIdGenerator( StringObjectIdGenerator.Instance )
                  .SetSerializer( new StringSerializer( BsonType.ObjectId ) );
     } );
}

结果

{
    "_id": ObjectId('56386cc49aa56e25d46aa279'),
    "ProjectId": "56386fa24ff36e25d46aa276",
    "Name": "alpha",
    "Dejavu": [
        {
            "FieldName": "apple",
            "LK003": {
                "Qty": 1,
                "Content": "red"
            }
        }
    ]
}

1 个答案:

答案 0 :(得分:1)

如果要为集合的主_id自动生成ObjectId,则必须使用属性标记Id属性:

[BsonId]
[BsonRepresentation(BsonType.ObjectId)]
public string Id { get; set; }

但是,根据that answers,你应该考虑你的方法,因为集合中嵌套元素的自动生成的ID没有意义。

  

您需要拥有一个单独的Dejavu集合并从BigTree文档中引用它,或者手动生成ObjectIds。