这与我计划保存在 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; }
}
记录的填充取决于用户将保存的选择(例如,这是一个 CarEntity-如果用户订购的车轮,属性 WheelSize 和 WheelQuantity 将被填充,如果用户要求重新绘制,RepaintingColor 将被填充等等)。
我知道每个实体有 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;
}
听起来你的 Entity 的属性会根据使用情况而有所不同。可能发生的情况是 Azure Table Storage 只为非 null 的属性创建列 (有值设置)。所以你只会看到为已设置的属性创建的列。
听起来好像 Table Storage 正在按照您的要求执行,但不一定像您期望的那样。正如 @ 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;
结果将包含 TableOperation 而不是完整实体的副本,以防这是您所期望的。
这种情况可能是使用例如 SQL 表(其中未给定值的字段具有数据库默认值或默认值为 null)与 Azure 表模型(其中未给定值的字段不存在)之间的差异。您只需要在读取 / 写入所选存储时注意该差异。
如果您需要将所有字段保存到表中,则为每个属性提供默认值,例如 string.Empty
如果字符串为 null 或空,那么它根本不会保存属性。你没有做错任何事情,当你使用它们时,你只需要在设计中考虑这一点。
如果您使用的是 TableEntity,那么它会为您执行空 / 空检查。如果您使用的是 DynamicTableEntity,那么您必须自己进行检查。
本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处
评论列表(2条)