MongoDB C # - методы ISupportInitialize не вызываются - PullRequest
0 голосов
/ 30 августа 2018

Я использую драйвер MongoDB C # для связи с экземпляром Mongo Atlas. Я реструктурирую схему нескольких документов и хочу использовать ISupportInitilize, чтобы прочитать некоторые дополнительные элементы и преобразовать их в новую ожидаемую схему.

Это старое определение документа:

public class ImageDocument : DocumentBase, ISupportInitialize
{
    [BsonExtraElements]
    public Dictionary<string, object> ExtraElements;

    //Other elements omitted for brevity.

    public string AzureImageId { get; set; }
    public string AzureImageUrl { get; set; }

    public void BeginInit()
    {
    }

    public void EndInit()
    {
    }
}

Вот новое определение документа:

public class ImageDocument : DocumentBase, ISupportInitialize
{
    [BsonExtraElements]
    public Dictionary<string, object> ExtraElements;

    //Other elements omitted for brevity

    public AzureImageInformationPage Original { get; set; } //Original, as uploaded

    public void BeginInit()
    {
    }

    public void EndInit()
    {
        if (Original == null)
        {
            Original = new AzureImageInformationPage {
                AzureImageId = ExtraElements.GetValueOrDefault("AzureImageId").ToString(),
                ImageUrl = ExtraElements.GetValueOrDefault("ImageUrl").ToString()
            };
        }
    }
}

По какой-то причине метод EndInit никогда не вызывается, хотя в документации MongoDB говорится, что это должно произойти автоматически .

Я использую следующий код для взаимодействия с драйвером MongoDB C #:

public async Task<IList<T>> RetrieveAll<T>() where T : DocumentBase
{
    return await GetCollection<T>().AsQueryable().ToListAsync();
}

public async Task<IList<T>> RetrieveWhere<T>(Expression<Func<T, bool>> query) where T : DocumentBase
{
    return await GetCollection<T>().AsQueryable().Where(query).ToListAsync();
}

public async Task<T> RetrieveSingle<T>(Expression<Func<T, bool>> query) where T : DocumentBase
{
    return await GetCollection<T>().AsQueryable().SingleOrDefaultAsync(query);
}    

private IMongoCollection<T> GetCollection<T>() where T : DocumentBase
{
    //Slightly modified from the real code, so it's easy to read.
    var collectionName = typeof(T).Name.Replace("Document", string.Empty);

    //Database name is hardcoded for now.
    var database = mongoClient.GetDatabase("MyDb");

    return database.GetCollection<T>(collectionName);
}

Как получить драйвер MongoDB для вызова методов ISupportInitialize? Заранее спасибо за помощь.

1 Ответ

0 голосов
/ 30 августа 2018

Я нашел проблему.

На момент написания, инициализация поддерживается только при компиляции с .NET 4.5. Я использую .NET core 2.0.

См. эту проблему в MongoDB Jira и строки 131-150 в BsonClassMapSerializer class.

Надеюсь, команда MongoDB вскоре добавит поддержку сериализации в ядре .NET.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...