我们在tableEntity继承了下面的实体
public class LinkEntity : TableEntity
{
public string LinkKey {get; set;}
public string LinkName {get; set;}
public int LinkValue {get; set;}
public string LinkId {get {return PartitionKey;} set;}
public LinkEntity(Link link)
{
PartitionKey = link.LinkId;
RowKey = link.LinkKey;
LinkValue = link.Value;
LinkName = link.LinkName;
}
}
我有一个API,使用Post和以下步骤添加上述实体:
Link的linkValue为空。
var cloudTable = cloudTableClient.GetTableReference(LinkTable);
cloudTable.CreateIfNotExistsAsync();
var postOperation = TableOperation.Insert(LinkEntity(link));
cloudTable.ExecuteAsync(postOperation);
但是,当我确实上面的时候,我再次收到linkValue为null。 因此,当该值为null时,我不想在tableStorage或column / property for entity中添加此值。
我无法完全摆脱属性linkValue,因为它正被其他API使用,这是那里的必填字段。因此,任何建议将不胜感激。
我认为应该有一些方法可以添加必填字段并完全忽略或删除实体,因为表存储中的表是无模式的。
答案 0 :(得分:1)
TL; DR;
请将LinkValue
属性设为可空。那应该可以解决问题。所以你的实体定义是:
public class LinkEntity : TableEntity
{
public string LinkKey {get; set;}
public string LinkName {get; set;}
public int? LinkValue {get; set;}
public string LinkId {get {return PartitionKey;} set;}
public LinkEntity(Link link)
{
PartitionKey = link.LinkId;
RowKey = link.LinkKey;
LinkValue = link.Value;
LinkName = link.LinkName;
}
}
更长的版本(有点):)
正如您正确提到的,Azure表格架构较少。另一个需要理解的重要事项是Azure表中的实体中没有null
值的概念。属性存在于实体中,或者不存在。
将int
保留为0
属性的数据类型(默认值为LinkValue
),即使您未提供任何值,此属性也将是用默认值初始化并存储。
通过将数据类型设置为nullable int
,如果您没有为此属性提供任何值,它将不会被初始化,并且在实体被序列化时将被SDK忽略。
但是,您需要确保使用此实体的应用程序(即接收端)不会假定该值始终存在于此属性中,并且应准备好处理空值。