c# - 用于 C# 类层次结构的 MongoDb 顺序 int id 生成器

标签 c# mongodb id-generation

我有一个带有独立 BsonClass 映射的 C# 类层次结构。我所有的类(class)都使用自定义顺序 int id 生成。 Last Id 存储在名为“Counter”的特殊集合中。我的问题是当 InsertOneAsync 之类的 mongo 集合方法被称为 InvalidCastException 时被抛出。

基础实体类:

[Serializable]
public abstract class Entity<TIdentifier> : IEntity<TIdentifier>
{
    public TIdentifier Id { get; set; }

    public DateTime CreatedDate { get; set; }

    public DateTime UpdatedDate { get; set; }

    public virtual bool IsTransient()
    {
        return (object) this.Id == null || this.Id.Equals((object) default (TIdentifier));
    }
}

子类:

public class Child : Entity<int> 
{
    public int SomeData { get; set; }
}

基类图:

public class EntityMap
{
    public static void Register()
    {
        BsonClassMap.RegisterClassMap<Entity<int>>(cm =>
        {
            cm.AutoMap();
            cm.MapIdProperty(c => c.Id)
                .SetIdGenerator(SeqIntIdGenerator<Entity<int>>.Instance)
                .SetSerializer(new Int32Serializer(BsonType.Int32));
        });
    }
}

子类图:

public class ChildMap
{
    public static void Register()
    {
        BsonClassMap.RegisterClassMap<Child>(cm =>
        {
            cm.AutoMap();
            cm.SetIgnoreExtraElements(true);
        });
    }
}

顺序 int id 生成器类:

public class SeqIntIdGenerator<TEntity> : IIdGenerator
{
    public static SeqIntIdGenerator<TEntity> Instance { get; } = new SeqIntIdGenerator<TEntity>();

    public object GenerateId(object container, object document)
    {
        //InvalidCastException thrown here on InsertOneAsync!!!
        var idSequenceCollection = ((IMongoCollection<TEntity>)container).Database.GetCollection<dynamic>("Counters");

        var filter = Builders<dynamic>.Filter.Eq("_id", ((IMongoCollection<TEntity>)container).CollectionNamespace.CollectionName);
        var update = Builders<dynamic>.Update.Inc("Seq", 1);

        var options = new FindOneAndUpdateOptions<dynamic>
        {
            IsUpsert = true,
            ReturnDocument = ReturnDocument.After
        };

        return idSequenceCollection.FindOneAndUpdate(filter, update, options).Seq;
    }

    public bool IsEmpty(object id)
    {
        return (int)id == 0;
    }
}

将容器从 Object 转换为 IMongoCollection 时抛出 InvalidCastException>。怎么做才对?我的 C# 驱动程序版本是 2.7.2。

最佳答案

如果您已经在使用动态,则可以为此关闭反射

public object GenerateId(object container, object document)
{
    var containerDynamic = (dynamic) container;
    var idSequenceCollection = containerDynamic.Database.GetCollection<dynamic>("Counters");

    var filter = Builders<dynamic>.Filter.Eq("_id", containerDynamic.CollectionNamespace.CollectionName);
    var update = Builders<dynamic>.Update.Inc("Seq", 1);

    var options = new FindOneAndUpdateOptions<dynamic>
    {
        IsUpsert = true,
        ReturnDocument = ReturnDocument.After
    };

    return idSequenceCollection.FindOneAndUpdate(filter, update, options).Seq;
}

关于c# - 用于 C# 类层次结构的 MongoDb 顺序 int id 生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54404419/

相关文章:

c# - C# 中 bool* 的用处

javascript - 下拉列表值的更改不会将更新后的值返回到 Controller

c# - 在vs2013中,全局asa错误处理不再起作用了吗?

具有条件总和的 MongoDB 聚合

Django MongoDB 问题

java - 文档的路径对 Firestore 自动生成的随机 ID 有影响吗?

c# - 替换 XML 文件中的值

javascript - 使用 Gulp Data 在 Gulp 中获取来自 Mongo 的数据

razor - 我如何知道 Razor Html 帮助程序生成什么 id?