如何在添加 table 存储时删除对象的一个 属性 ?
how to remove one property of an object when it is null while adding in 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 的链接值为空。
var cloudTable = cloudTableClient.GetTableReference(LinkTable);
cloudTable.CreateIfNotExistsAsync();
var postOperation = TableOperation.Insert(LinkEntity(link));
cloudTable.ExecuteAsync(postOperation);
但是,当我继续上面的操作时,我再次收到 linkValue 为 null。
因此,当此值为 null 时,我不想在实体的 tableStorage 或 column/property 中添加此值。
我无法完全删除 属性 linkValue,因为它正被其他 API 使用,这是那里的必填字段。因此,任何建议将不胜感激。
我认为应该有一些方法可以让我们添加必填字段并完全忽略或删除实体中的列,因为 table 中的 table 存储是无模式的。
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
保留为 LinkValue
属性的数据类型(默认值为 0
),即使您未提供任何值,此属性也将使用默认值初始化并存储。
通过将数据类型设置为nullable int
,如果您不为此属性提供任何值,它将不会被初始化,并且在实体被序列化时会被 SDK 忽略。
但是,您需要确保使用此实体的应用程序(即接收端)不会假定该值将始终存在于此属性中,并且应该准备好处理空值。
我们有以下继承自 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 的链接值为空。
var cloudTable = cloudTableClient.GetTableReference(LinkTable);
cloudTable.CreateIfNotExistsAsync();
var postOperation = TableOperation.Insert(LinkEntity(link));
cloudTable.ExecuteAsync(postOperation);
但是,当我继续上面的操作时,我再次收到 linkValue 为 null。 因此,当此值为 null 时,我不想在实体的 tableStorage 或 column/property 中添加此值。
我无法完全删除 属性 linkValue,因为它正被其他 API 使用,这是那里的必填字段。因此,任何建议将不胜感激。
我认为应该有一些方法可以让我们添加必填字段并完全忽略或删除实体中的列,因为 table 中的 table 存储是无模式的。
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
保留为 LinkValue
属性的数据类型(默认值为 0
),即使您未提供任何值,此属性也将使用默认值初始化并存储。
通过将数据类型设置为nullable int
,如果您不为此属性提供任何值,它将不会被初始化,并且在实体被序列化时会被 SDK 忽略。
但是,您需要确保使用此实体的应用程序(即接收端)不会假定该值将始终存在于此属性中,并且应该准备好处理空值。