DynamicTableEntity PartitionKey和RowKey

Yak*_*kov 4 c# dynamic-tables azure

我创建DynamicTableEntity如下:

string env = "envTest";
stting ver = "1.0";
siring id = "12356";
string mode = "verify";
DynamicTableEntity entryEntity = DynamicTableEntity(env,ver);
entryEntity.Properties.Add("Id", id);
entryEntity.Properties.Add("Mode", mode);
Run Code Online (Sandbox Code Playgroud)

结果创建了一个包含列的表:"Id","Mode","PartitionKey","RowKey"我想更改"PartitionKey","RowKey"的名称,即我希望env成为partitionKey但是列名称为"Env".我该怎么做?

Pet*_*Lea 6

虽然您无法重命名PartitionKey和RowKey,但您可以直接从表中解析为DTO.

我发现将数据投射到不同的受众群体(即非管理员的有限视图等)非常方便

HTH

var query = MyEntityDBO.CreateQuery<DynamicTableEntity>()
            .Where(x => x.PartitionKey.Equals("Blah"))
            .Resolve(MyEntityDTO.GetEntityResolver());
var segment = await query.ExecuteSegmentedAsync(new TableContinuationToken());
if(segment.Results.Count > 0) {
     // Results = IEnumerable<MyEntityDTO>
}

public class MyEntityDTO
{
    public string Id { get; set; }
    public string Mode { get; set;  }
    public string Env { get; set; }
    public string Ver { get; set; }

    public static EntityResolver<MyEntityDTO> GetEntityResolver()
    {
        return (pk, rk, ts, props, etag) =>
        { 
             Env = pk,
             Ver = rk,
             Id = props["Id"].StringValue,
             Mode = props["Mode"].StringValue
        };
    }
}
Run Code Online (Sandbox Code Playgroud)


Gau*_*tri 5

简单的答案是您不能。PartitionKey并且RowKey是系统定义的属性(以及Timestamp),您无法更改其名称。您可以做的是为定义另外两个自定义属性,Env以及Ver是否需要在应用程序中通过这些名称访问属性。

DynamicTableEntity entryEntity = DynamicTableEntity(env,ver);
entryEntity.Properties.Add("Id", id);
entryEntity.Properties.Add("Mode", mode);
entryEntity.Properties.Add("Env", env);
entryEntity.Properties.Add("Ver", ver);
Run Code Online (Sandbox Code Playgroud)