2015-05-18 32 views
2

保存所有这是相同的,我计划在Azure Table中存储(ATS)保存实体:Azure的表存储不以实体定义

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

我想我的问题是通过回答 - [link] http:// stackoverflow。COM /问题/ 11071899 /存储的十进制数据型在-天青桌[/链接]。我只是没有意识到,十进制数据类型会给我这方面的问题。感谢那些帮助! – Patrick

回答

1

听起来像您的实体的属性根据使用情况而异。可能发生的情况是,Azure表存储仅为不为空的属性创建列(设置了值)。所以你只会看到为已设置的属性创建的列。

0

听起来好像表存储按照您的要求执行,但不一定像您期望的那样执行。正如@Paul Fryer所回答的那样,ATS不会存储空值,因为您不会(通过您的引用代码)初始化CarEntity属性,所以默认情况下它们将为空。因此只有用户设置的属性才会保存到表格中。

https://msdn.microsoft.com/en-us/library/azure/hh452242.aspx #Remarks:

如果插入或更换实体操作用于替换 实体,从以前的实体的任何属性将如果 新实体没有定义它们删除。也会删除具有空值的属性 。

此外,从你的代码

TableResult result = table.Execute(insertOrMergeOperation); 
CarEntity objEntity = result.Result as CarEntity; 

结果将包含TableOperation不在的情况下全部的实体,这是你期待什么样的副本。

此场景可能与使用(例如,未赋予字段值的数据库的数据库缺省值或默认值为null)的SQL表与使用不存在未赋值的字段的Azure表模型之间的差异。您只需在读取/写入所选存储时注意其差异。

如果您需要将所有字段持久保存到表中,请为每个属性提供一个默认值,例如, string.Empty

0

如果字符串为空或空,那么它根本不保存属性。你没有做错任何事情,当你与他们合作时,你必须在设计中考虑这一点。

如果您使用TableEntity,那么它会为您执行空/空检查。如果你使用DynamicTableEntity,那么你必须自己检查一下。

相关问题