Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Entity Framework - Azure Table Storage Provider - Enum Support

I am actually using the Azure Storage Table provider for EF (EntityFramework.AzureTableStorage 7.0.0-beta1).

I've ended up how to configure the 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
    }
}

But Now I would like to add an enum as part of the Subscription model. I've found a workaround to do this:

I've got an enum :

public enum QueuePriority
{
    High,
    Low
}

I've added these properties to the Subscription class:

public int PriorityId { get; set; }

public QueuePriority Priority
{
    get { return (QueuePriority)PriorityId; }
    set { PriorityId = (int)value; }
}

And Declare the Priority property as shadow in EF configuration so that I'm not going to have the PriorityId and the Priority stored both in the Azure Table :

protected override void OnModelCreating(Microsoft.Data.Entity.Metadata.ModelBuilder modelBuilder)
{   
    ...
         
    // We are not mapping the Enum in the database only the IDs.
    modelBuilder.Entity<Subscription>().Property(s => s.Priority).Shadow();
}

So I am wondering if there is a better way to accomplish this and/or If next versions of EF.AzureTableStorage is going to support Enum ?

Thanks

like image 411
Thomas Avatar asked Mar 13 '23 10:03

Thomas


2 Answers

EF Azure Table Storage beta1 was a prototype that has been discontinued for now. See also https://stackoverflow.com/a/35071077/2526265

like image 169
natemcmaster Avatar answered Mar 25 '23 16:03

natemcmaster


Azure Table Storage SDK version > 8.0.0 already supports enums and many other simple and complex property types so you do not really need to use an extra framework just for that purpose.

You can simply flatten your POCO object using TableEntity.Flatten method: https://msdn.microsoft.com/en-us/library/azure/mt775435.aspx

Write the flattened dictionary to table storage. When you read just pass the dictionary of EntityProperties to TableEntity.ConvertBack method: https://msdn.microsoft.com/en-us/library/azure/mt775435.aspx

and it will recompose your original object including its Enum and other types of properties.

Your entity classes do not need to inherit from TableEntity class or implement ITableEntity interface, they can be just POCO objects with simple properties OR they may have nested complex properties of their own with many layers of object graph. Flatten and ConvertBack methods support both.

like image 44
Dogu Arslan Avatar answered Mar 25 '23 18:03

Dogu Arslan