MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Дискриминатори за тип драйвер MongoDB C# с общ клас, наследяващ от необобщен базов клас

След известно експериментиране открих, че можете да напишете свои собствени конвенции за дискриминатор. Наистина не мога да разбера защо, но конвенцията за дискриминатор по подразбиране изглежда използва свойството Name на класа тип вместо FullName, което го прави безполезен за общи класове.

Вместо това използвах този код:

class FooDiscriminatorConvention : IDiscriminatorConvention
{
    public string ElementName
    {
        get { return "_t"; }
    }

    public Type GetActualType(MongoDB.Bson.IO.BsonReader bsonReader, Type nominalType)
    {
        if(nominalType!=typeof(MyAbstractClass))
            throw new Exception("Cannot use FooDiscriminator for type " + nominalType);

        var ret = nominalType;

        var bookmark = bsonReader.GetBookmark();
        bsonReader.ReadStartDocument();
        if (bsonReader.FindElement(ElementName))
        {
            var value = bsonReader.ReadString();

            ret = Type.GetType(value);

            if(ret==null)
                throw new Exception("Could not find type " + value);

            if(!ret.IsSubclassOf(typeof(MyAbstractClass)))
                throw new Exception("Database type does not inherit from MyAbstractClass.");
        }

        bsonReader.ReturnToBookmark(bookmark);

        return ret;
    }

    public BsonValue GetDiscriminator(Type nominalType, Type actualType)
    {
        if (nominalType != typeof(MyAbstractClass))
            throw new Exception("Cannot use FooDiscriminator for type " + nominalType);

        return actualType.FullName;
    }
}

И да го регистрирате с

BsonSerializer.RegisterDiscriminatorConvention(typeof(MyGenericClass<>), new FooDiscriminatorConvention()); //is this needed?
BsonSerializer.RegisterDiscriminatorConvention(typeof(MyAbstractClass), new FooDiscriminatorConvention());

Също така трябваше да направя базовия клас неабстрактен, за да избегна грешката „не мога да създам екземпляри на абстрактни класове“. Би било хубаво да имам абстрактен базов клас, но тъй като производният клас е общ, не мога да използвам BsonKnownTypes.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB:Неправилно формирана гео заявка с $geoIntersect върху многоъгълник

  2. Възможно ли е да се подобри скоростта на Mongoexport?

  3. mongoimport CSV с pymongo

  4. Съставен ключ MongoDB

  5. Заявка за вложен масив в MongoDB