Entity Framework - Proveedor de almacenamiento de tablas de Azure - Enum Support

azure-table-storage entity-framework-core

Pregunta

De hecho, estoy usando el proveedor de la tabla de almacenamiento de Azure para EF ( EntityFramework.AzureTableStorage 7.0.0-beta1 ).

He terminado cómo configurar el DbContext:

public class Subscription
{
    public string Environment { get; set; }

    public string Name { get; set; }

    ...
    ...            
}

public class EF7Context : DbContext
{
    public DbSet<Subscription> Subscriptions { get; set; }

    protected override void OnConfiguring(DbContextOptions options)
    {
        options.UseAzureTableStorage("MyconnectionString");
    }

    protected override void OnModelCreating(Microsoft.Data.Entity.Metadata.ModelBuilder modelBuilder)
    {
        // Configure the Azure Table Storage
        modelBuilder.Entity<Subscription>()
            .ForAzureTableStorage() // Data are stored in an Azure Table Storage.
            .Table("SubscriptionDev") // Name of the Table in the Azure Storage Account
            .PartitionAndRowKey(s => s.Environment, s => s.Name); // Map the partition and the row key
    }
}

Pero ahora me gustaría agregar una enumeración como parte del modelo de Subscription . He encontrado una solución para hacer esto:

Tengo una enumeración:

public class Subscription
{
    public string Environment { get; set; }

    public string Name { get; set; }

    ...
    ...            
}

public class EF7Context : DbContext
{
    public DbSet<Subscription> Subscriptions { get; set; }

    protected override void OnConfiguring(DbContextOptions options)
    {
        options.UseAzureTableStorage("MyconnectionString");
    }

    protected override void OnModelCreating(Microsoft.Data.Entity.Metadata.ModelBuilder modelBuilder)
    {
        // Configure the Azure Table Storage
        modelBuilder.Entity<Subscription>()
            .ForAzureTableStorage() // Data are stored in an Azure Table Storage.
            .Table("SubscriptionDev") // Name of the Table in the Azure Storage Account
            .PartitionAndRowKey(s => s.Environment, s => s.Name); // Map the partition and the row key
    }
}

He añadido estas propiedades a la clase de Subscription :

public class Subscription
{
    public string Environment { get; set; }

    public string Name { get; set; }

    ...
    ...            
}

public class EF7Context : DbContext
{
    public DbSet<Subscription> Subscriptions { get; set; }

    protected override void OnConfiguring(DbContextOptions options)
    {
        options.UseAzureTableStorage("MyconnectionString");
    }

    protected override void OnModelCreating(Microsoft.Data.Entity.Metadata.ModelBuilder modelBuilder)
    {
        // Configure the Azure Table Storage
        modelBuilder.Entity<Subscription>()
            .ForAzureTableStorage() // Data are stored in an Azure Table Storage.
            .Table("SubscriptionDev") // Name of the Table in the Azure Storage Account
            .PartitionAndRowKey(s => s.Environment, s => s.Name); // Map the partition and the row key
    }
}

Y declare la propiedad Priority como sombra en la configuración de EF para que no tenga el ID de Prioridad y la Prioridad almacenados en la Tabla de Azure:

public class Subscription
{
    public string Environment { get; set; }

    public string Name { get; set; }

    ...
    ...            
}

public class EF7Context : DbContext
{
    public DbSet<Subscription> Subscriptions { get; set; }

    protected override void OnConfiguring(DbContextOptions options)
    {
        options.UseAzureTableStorage("MyconnectionString");
    }

    protected override void OnModelCreating(Microsoft.Data.Entity.Metadata.ModelBuilder modelBuilder)
    {
        // Configure the Azure Table Storage
        modelBuilder.Entity<Subscription>()
            .ForAzureTableStorage() // Data are stored in an Azure Table Storage.
            .Table("SubscriptionDev") // Name of the Table in the Azure Storage Account
            .PartitionAndRowKey(s => s.Environment, s => s.Name); // Map the partition and the row key
    }
}

Así que me pregunto si hay una mejor manera de lograr esto y / o ¿Si las próximas versiones de EF.AzureTableStorage van a ser compatibles con Enum?

Gracias

Respuesta aceptada

EF Azure Table Storage beta1 fue un prototipo que se ha descontinuado por el momento. Consulte también https://stackoverflow.com/a/35071077/2526265


Respuesta popular

La versión del SDK de Azure Table Storage> 8.0.0 ya es compatible con enumeraciones y muchos otros tipos de propiedades simples y complejas, por lo que realmente no necesita usar un marco adicional solo para ese propósito.

Simplemente puede aplanar su objeto POCO usando el método TableEntity.Flatten: https://msdn.microsoft.com/en-us/library/azure/mt775435.aspx

Escribe el diccionario aplanado en la mesa de almacenamiento. Cuando lea, simplemente pase el diccionario de EntityProperties al método TableEntity.ConvertBack : https://msdn.microsoft.com/en-us/library/azure/mt775435.aspx

y recompondrá su objeto original, incluido su Enum y otros tipos de propiedades.

Sus clases de entidad no necesitan heredar de la clase TableEntity o implementar la interfaz ITableEntity , pueden ser solo objetos POCO con propiedades simples O pueden tener propiedades complejas anidadas propias con muchas capas de gráficos de objetos. ConvertBack métodos Flatten y ConvertBack soportan ambos.




Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué