Entity Framework - Provider di archiviazione tabella di Azure - Supporto Enum

azure-table-storage entity-framework-core

Domanda

In realtà sto utilizzando il provider Azure Storage Table per EF ( EntityFramework.AzureTableStorage 7.0.0-beta1 ).

Ho finito per configurare 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
    }
}

Ma ora vorrei aggiungere un enum come parte del modello Subscription . Ho trovato una soluzione alternativa per fare questo:

Ho un enume:

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
    }
}

Ho aggiunto queste proprietà alla classe 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
    }
}

E Dichiara la proprietà Priority come shadow nella configurazione EF in modo che non abbia il PriorityId e la Priorità archiviati entrambi nella Tabella di 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
    }
}

Quindi mi chiedo se c'è un modo migliore per farlo e / o se le prossime versioni di EF.AzureTableStorage supporteranno Enum?

Grazie

Risposta accettata

EF Azure Table Storage beta1 era un prototipo che è stato interrotto per ora. Vedi anche https://stackoverflow.com/a/35071077/2526265


Risposta popolare

La versione di Azure Table Storage SDK> 8.0.0 supporta già enumerazioni e molti altri tipi di proprietà semplici e complessi, quindi non è necessario utilizzare un framework aggiuntivo solo per tale scopo.

Puoi semplicemente appiattire il tuo oggetto POCO usando il metodo TableEntity.Flatten: https://msdn.microsoft.com/en-us/library/azure/mt775435.aspx

Scrivi il dizionario appiattito nella memoria della tabella. Quando leggi, passa il dizionario di EntityProperties al metodo TableEntity.ConvertBack : https://msdn.microsoft.com/en-us/library/azure/mt775435.aspx

e ricompone il tuo oggetto originale incluso il suo Enum e altri tipi di proprietà.

Le classi di entità non hanno bisogno di ereditare dalla classe TableEntity o implementare ITableEntity interfaccia ITableEntity , possono essere solo oggetti POCO con proprietà semplici OPPURE possono avere nidificate proprietà complesse proprie con molti livelli di oggetti grafici. ConvertBack metodi Flatten e ConvertBack supportano entrambi.




Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché