我们有从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为null。
var cloudTable = cloudTableClient.GetTableReference(LinkTable);
cloudTable.CreateIfNotExistsAsync();
var postOperation = TableOperation.Insert(LinkEntity(link));
cloudTable.ExecuteAsync(postOperation);
但是,当我确实在上面时,我再次收到linkValue为null。因此,当此值为null时,我不希望在tableStorage或实体的列/属性中添加此值。
我无法完全摆脱属性linkValue,因为它正在被其他API使用,这是一个必需的字段。因此,任何建议将不胜感激。
我认为应该有一些方法可以添加必需的字段并从实体中完全忽略或删除列,因为表存储中的表是无模式的。
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 Tables中的实体中没有null
值的概念。属性存在于实体中,或者不存在。
通过将int
保留为0
属性的数据类型(其默认值为LinkValue
),即使您未提供任何值,此属性也将使用默认值进行初始化并存储。
通过将数据类型设置为nullable int
,如果您没有为此属性提供任何值,它将不会被初始化,并且在实体被序列化时将被SDK忽略。
但是,您需要确保使用此实体的应用程序(即接收端)不会假定该值始终存在于此属性中,并且应准备好处理空值。