为什么 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 门户:
我将 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 门户: