У меня есть иерархия классов C # с разделенными отображениями BsonClass.Все мои классы используют пользовательскую последовательную генерацию int id.Последний идентификатор хранится в специальной коллекции под названием «Счетчик».Моя проблема заключается в том, что методы коллекции mongo, такие как InsertOneAsync, получают 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);
});
}
}
Класс генератора последовательных внутренних идентификаторов:
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;
}
}
InvalidCastException вызывается при приведении контейнера из Object в IMongoCollection>.Как это сделать правильно?Моя версия драйвера C # 2.7.2.