这与我计划在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,因此,打开) 。
假设此实体中有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;
}
答案 0 :(得分:1)
根据使用情况,您的实体的属性会有所不同。可能发生的是Azure表存储仅为非空属性(具有值集)创建列。因此,您只会看到为已设置的属性创建的列。
答案 1 :(得分:0)
听起来好像Table Storage正在按照您的要求执行,但不一定如您所愿。正如@Paul Fryer所回答的那样,ATS不会存储空值,因为您没有(通过引用的代码)初始化CarEntity属性,默认情况下它们将为null。因此,只有用户设置的属性才会保存到表中。
https://msdn.microsoft.com/en-us/library/azure/hh452242.aspx #Remarks:
如果使用“插入或替换实体”操作来替换 实体,如果是,前一实体的任何属性都将被删除 新实体没有定义它们。具有空值的属性将 也被删除了。
另外,从你的代码
TableResult result = table.Execute(insertOrMergeOperation);
CarEntity objEntity = result.Result as CarEntity;
结果将包含TableOperation,而不是完整实体的副本,以防您满意。
这种情况可能是使用例如SQL表的区别,其中没有给出值的字段具有数据库默认值或默认为null,而Azure表模型中没有给出值的字段不存在。在读取/写入所选存储时,您只需要注意这种差异。
如果您要求将所有字段保留到表中,则为每个属性提供默认值,例如string.Empty
答案 2 :(得分:0)
如果字符串为null或为空,则根本不保存该属性。你没有做错任何事情,你只需要在设计中考虑这一点。
如果您正在使用TableEntity,那么它会为您执行null / empty检查。如果您正在使用DynamicTableEntity,那么您必须自己进行检查。