如何在添加表存储时删除对象的一个​​属性?

时间:2018-04-22 18:54:16

标签: azure azure-table-storage

我们在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使用,这是那里的必填字段。因此,任何建议将不胜感激。

我认为应该有一些方法可以添加必填字段并完全忽略或删除实体,因为表存储中的表是无模式的。

1 个答案:

答案 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忽略。

但是,您需要确保使用此实体的应用程序(即接收端)不会假定该值始终存在于此属性中,并且应准备好处理空值。