为什么 Guid 在 azure table 存储中存储为字符串而不是 guid 类型?

Why Guid is stored as string and not guid type in azure table storage?

我将 guid 存储在我的 azure table 存储中,但类型是 在 azure table 存储门户中显示为字符串而不是 guid。

我正在使用带有 sas 令牌的其余 api 将实体存储在 azure table 存储中。

{
  public Guid id {get;set;}
  public string name {get;set;}
}

string sastoke = GetSasToken(); // no issues here
string url = config.table_storage_url + sastoken  // no issues here

// assuming i already have rowkey and partition key 
myClass entity = new myClass{id = Guid.NewGuid();name = "abcdef";}

var content = new StringContent(JsonConvert.SerializeObject(entity), Encoding.UTF8, "application/json");
// creating http client
using (HttpClient client = new HttpClient())
{
   client.DefaultRequestHeaders.Accept.Clear();
   client.DefaultRequestHeaders.Accept.Add(new 
          MediaTypeWithQualityHeaderValue("application/json"));
   HttpResponseMessage response = await client.PostAsync(url, content);
   return response;
 }

预期:id 类型在 azure table 存储门户中应该是 guid。

实际:id 类型在 azure table 存储门户中显示字符串。

当你使用 azure table storage rest api 插入数据时,按照这个 doc:

默认情况下,属性 被创建为字符串类型,除非您指定不同的类型。

如果要指定显式类型,格式应如下所示(doc here):

所以你需要在使用 rest api 时明确指定 属性 的类型(如 Edm.Guid)。另请注意,如果您使用的是 SDK,则不会出现此类问题。

这是一个简单的代码(也许有更好的指定类型的方法,但这里只是解释一下):

实体class:

public class MyClass
{

    public string PartitionKey { get; set; }
    public string RowKey { get; set; }
    public string Name { get; set; }

    public Guid TestId { get; set; }
}

主要方法:

        static void Main(string[] args)
        {

            string url_with_sasToken = "https://xxx.table.core.windows.net/ttt?sasToken";

            MyClass entity = new MyClass
            {
                PartitionKey = "ivan2",
                RowKey = "y1",
                Name = "jack60",
                TestId = Guid.NewGuid()
            };


            //here, I add the odata type for Guid type
            string s = JsonConvert.SerializeObject(entity).Replace("}","");
            s += ",\"TestId@odata.type\"" + ":" + "\"Edm.Guid\"}";
            Console.WriteLine(s);

            var content = new StringContent(s, Encoding.UTF8, "application/json");

            using (HttpClient client = new HttpClient())
            {
                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Accept.Add(new
          MediaTypeWithQualityHeaderValue("application/json"));
                var t2 = client.PostAsync(url_with_sasToken , content).GetAwaiter().GetResult();
                Console.WriteLine(t2.StatusCode);
            }

            Console.WriteLine("completed---");
            Console.ReadLine();
        }

然后登录 Azure 门户: