实体框架 - Azure表存储提供程序 - 枚举支持

时间:2016-02-01 23:41:59

标签: entity-framework-core azure-table-storage

我实际上正在使用Azure存储表提供程序(EntityFramework.AzureTableStorage 7.0.0-beta1)。

我结束了如何配置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
    }
}

但是现在我想添加一个枚举作为Subscription模型的一部分。 我找到了解决方法:

我有一个枚举:

public enum QueuePriority
{
    High,
    Low
}

我已将这些属性添加到Subscription类:

public int PriorityId { get; set; }

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

并在EF配置中将Priority属性声明为阴影,这样我就不会在Azure表中同时存储PriorityId和优先级:

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();
}

所以我想知道是否有更好的方法来实现这个和/或如果下一版本的EF.AzureTableStorage将支持Enum?

由于

3 个答案:

答案 0 :(得分:3)

EF Azure Table Storage beta1是原型,目前已停产。另请参阅https://stackoverflow.com/a/35071077/2526265

答案 1 :(得分:1)

Azure Table Storage SDK版本&gt; 8.0.0已经支持枚举和许多其他简单和复杂的属性类型,因此您不需要为此目的使用额外的框架。

您可以使用TableEntity.Flatten方法简单地展平您的POCO对象: https://msdn.microsoft.com/en-us/library/azure/mt775435.aspx

将展平的字典写入表存储。当您阅读时,只需将EntityProperties字典传递给TableEntity.ConvertBack方法: https://msdn.microsoft.com/en-us/library/azure/mt775435.aspx

它将重新组合原始对象,包括其Enum和其他类型的属性。

您的实体类不需要从TableEntity类继承或实现ITableEntity接口,它们可以只是具有简单属性的POCO对象,也可以具有自己的多个嵌套复杂属性。对象图。 FlattenConvertBack方法都支持这两种方法。

答案 2 :(得分:0)

您是否看过像Slazure这样的动态ORM,有了它,您就不会像使用Entity Framework那样需要这种设置,它支持Azure Table Storage。节省了我们很多时间。我不了解它的基本原理,但它会在您编写代码时自动映射所有类型,因此您不需要定义任何实体等。