Функции Azure не создают столбцы Azure Tables локально

Я пытаюсь создать функцию Azure. Локально я хочу иметь возможность протестировать свою функцию перед ее развертыванием. Я разрабатываю MacOS 11.2.3 с использованием VS Code. Я использую Azurite в качестве локального хранилища эмулятор, работающий в Docker. Я могу подключиться к локальному эмулятору и увидеть свои очереди и хранилище. Приложение «Мои функции» использует netcoreapp3.1 и является приложением «Функции версии 3».

Мой триггер — это новая полезная нагрузка, полученная очередью. Мой триггер работает просто отлично, и когда я записываю свои данные в таблицу хранилища Azure, я вижу RowKey, PartitionKey и Timestamp. Я не вижу никаких данных, которые я создал. Вот мой код:

public static class MyFunction
{
    [FunctionName("MyFunction")]
    [return: Table("mytable")]
    public static MyObject Run([QueueTrigger("myqueue")]string queueItem, ILogger log)
    {
        log.LogInformation($"C# Queue trigger function processed");
        var myObject = JsonConvert.DeserializeObject<MyObject>(queueItem);
        log.LogInformation(JsonConvert.SerializeObject(myObject));
        return myObject;
    }
}

Вот MyObject.cs

using System;
using Microsoft.WindowsAzure.Storage.Table;

namespace MyProject.models
{
    public sealed class MyObject : TableEntity
    {
        public MyObject(string myProperty)
        {
            string PartitionMonth = DateTime.Now.ToMonthName();
            string PartitionYear = DateTime.Now.Year.ToString();
            PartitionKey = $"{PartitionMonth}-{PartitionYear}";

            RowKey = Guid.NewGuid().ToString();
            MyProperty = myProperty;

        }
        public string MyProperty { get; }
    }
}

Проблема в том, что я не вижу создания столбца MyProperty. У моей полезной нагрузки JSON, переданной в очередь, она есть, я вижу, что она зарегистрирована в регистраторе, я просто не вижу столбец в Azure Storage Explorer. Я вижу строку, созданную каждый раз, когда я запускаю свою функцию. Пожалуйста, помогите мне понять, почему я не вижу свои данные.




Ответы (1)


Я полагаю, что вы столкнулись с этой проблемой, потому что у вас нет общедоступного сеттера для вашего MyProperty.

Пожалуйста, попробуйте изменить эту строку кода:

public string MyProperty { get; }

to

public string MyProperty { get; set; }

И ваш код должен работать нормально.

Ссылка: https://github.com/Azure/azure-storage-net/blob/933836a01432da169966017f0848d7d6b05fc624/Lib/Common/Table/TableEntity.cs#L406 (см. раздел Применение общедоступного метода получения и установки в коде).

internal static bool ShouldSkipProperty(PropertyInfo property, OperationContext operationContext)
{
    // reserved properties
    string propName = property.Name;
    if (propName == TableConstants.PartitionKey ||
        propName == TableConstants.RowKey ||
        propName == TableConstants.Timestamp ||
        propName == TableConstants.Etag)
    {
        return true;
    }

    MethodInfo setter = property.FindSetProp();
    MethodInfo getter = property.FindGetProp();

    // Enforce public getter / setter
    if (setter == null || !setter.IsPublic || getter == null || !getter.IsPublic)
    {
        Logger.LogInformational(operationContext, SR.TraceNonPublicGetSet, property.Name);
        return true;
    }

    // Skip static properties
    if (setter.IsStatic)
    {
        return true;
    }

    // properties with [IgnoreAttribute]
#if WINDOWS_RT || NETCORE 
    if (property.GetCustomAttribute(typeof(IgnorePropertyAttribute)) != null)
#else
    if (Attribute.IsDefined(property, typeof(IgnorePropertyAttribute)))
#endif
    {
        Logger.LogInformational(operationContext, SR.TraceIgnoreAttribute, property.Name);
        return true;
    }

    return false;
}
person Gaurav Mantri    schedule 20.05.2021
comment
Это сработало. Я также пытался использовать частный набор, и это тоже не сработало. Существует ли хороший шаблон для использования неизменяемого объекта И таблиц Azure? - person BigDevJames; 20.05.2021