这与我计划在Azure表存储(ATS)中保存的实体相同:
public class CarEntity : TableEntity
{
public CarEntity(string objPartitionKey, string objRowKey)
{
this.PartitionKey = objPartitionKey;
this.RowKey = objRowKey;
}
public string TableName
{
get { return "EntityTableName"; }
}
public string Property1 { get; set; }
// and this goes on
public string Property60 { get; set; }
}
不是所有的属性都是必需的。记录的填充取决于用户要保存的选择(例如,这是一个实体-如果用户订购车轮,则填充属性WheelSize和WheelQuantity,如果用户要求重新绘制,则填充RepaintingColor,等等)。
假设在这个实体中有60个属性,并不是所有的属性都保存在ATS中。尽管定义了属性并且没有返回错误,但该数据不会保存在表中。我知道每个实体有1MB的限制,但考虑到我们所做的计算,它离1MB的限制有点远。
任何帮助为什么列不出现,即使属性被相应地保存?我的保存函数定义如下:
public static CarEntity CarInsertOrReplace(CarEntity entity)
{
if (entity == null)
{
throw new ArgumentNullException("entity");
}
var table = SetupTable(entity.TableName);
table.CreateIfNotExists();
TableOperation insertOrMergeOperation = TableOperation.InsertOrReplace(entity);
TableResult result = table.Execute(insertOrMergeOperation);
CarEntity objEntity = result.Result as CarEntity;
return objEntity;
}
听起来实体的属性根据使用情况而变化。可能发生的情况是,Azure表存储仅为非空(具有值集)的属性创建列。因此,您将只能看到为已设置的属性创建的列。
听起来好像表存储正在按照您的要求执行,但不一定像您期望的那样。正如@Paul Fryer所回答的那样,ATS不会存储空值,并且因为您没有(通过引用的代码)初始化CarEntity属性,默认情况下它们将为空。因此,只有用户设置的属性才会保存到表中。
https://msdn.microsoft.com/en-us/library/azure/hh452242.aspx备注:
如果使用"插入或替换实体"操作替换实体,则前一个实体中的任何属性都将被删除新实体没有定义它们。具有空值的属性将
同样,从你的代码
TableResult result = table.Execute(insertOrMergeOperation);
CarEntity objEntity = result.Result as CarEntity;
result将包含TableOperation而不是完整实体的副本,如果这是您所期望的。
此场景可能是使用以下两种情况的区别:例如,SQL表中未给定值的字段具有数据库默认值或默认值为null,而Azure表模型中未给定值的字段不存在。你只需要在读/写所选择的存储时意识到这种差异。
如果你需要将所有字段持久化到表中,那么为每个属性提供一个默认值,例如string。空
如果字符串为null或空,则根本不保存该属性。你并没有做错什么,你只是需要在你的设计中考虑到这一点。
如果你使用TableEntity,那么它会为你做null/empty检查。如果你使用DynamicTableEntity,那么你必须自己做检查。