有没有办法配置 Azure Table 更新以保留 future/unknown properties/columns?
Is there a way to configure Azure Table updates to preserve future/unknown properties/columns?
假设我创建了一个模型
public class Foo :TableEntity {
public int OriginalProperty {get;set;}
}
然后我部署了一个服务,该服务使用类似于...的代码定期更新 OriginalProperty 的值...
//use model-based query
var query = new TableQuery<Foo>().Where(…);
//get the (one) result
var row= (await table.ExecuteQueryAsync(query)).Single()
//modify and write it back
row.OriginalProperty = some_new_value;
await table.ExecuteAsync(TableOperation.InsertOrReplace(row));
稍后我决定向 Foo 添加一个新的 属性 以供不同的服务使用。
public class Foo :TableEntity {
public int OriginalProperty {get;set;}
public int NewProperty {get;set;}
}
我在本地进行此更改并开始从我的本地计算机更新一些记录而不更新原始部署的服务。
我看到的行为是,一旦部署的服务更新记录,我从本地计算机对 NewProperty 所做的更改就会丢失。当然,这在某些方面是有道理的。该服务不知道已添加 NewProperty,也没有理由保留它。但是我的理解是 TableEntity 实现是基于字典的,所以我希望它 'ignore'(即保留)新引入的列而不是删除它们。
有没有办法配置 query/insertion 以获得我想要的行为?我知道 DynamicTableEntity 但不清楚将其用作基础 class 是否会导致模型属性的行为发生变化。
澄清一下,我并不是说不断摆弄模型或为同一个 table 使用多个客户端模型是一个好习惯,但这绝对是能够偶尔添加一个列而不用担心重新部署可能触及受影响的每个服务很有用 table.
您可以使用 InsertOrMerge 而不是 InsertOrReplace。
假设我创建了一个模型
public class Foo :TableEntity {
public int OriginalProperty {get;set;}
}
然后我部署了一个服务,该服务使用类似于...的代码定期更新 OriginalProperty 的值...
//use model-based query
var query = new TableQuery<Foo>().Where(…);
//get the (one) result
var row= (await table.ExecuteQueryAsync(query)).Single()
//modify and write it back
row.OriginalProperty = some_new_value;
await table.ExecuteAsync(TableOperation.InsertOrReplace(row));
稍后我决定向 Foo 添加一个新的 属性 以供不同的服务使用。
public class Foo :TableEntity {
public int OriginalProperty {get;set;}
public int NewProperty {get;set;}
}
我在本地进行此更改并开始从我的本地计算机更新一些记录而不更新原始部署的服务。
我看到的行为是,一旦部署的服务更新记录,我从本地计算机对 NewProperty 所做的更改就会丢失。当然,这在某些方面是有道理的。该服务不知道已添加 NewProperty,也没有理由保留它。但是我的理解是 TableEntity 实现是基于字典的,所以我希望它 'ignore'(即保留)新引入的列而不是删除它们。
有没有办法配置 query/insertion 以获得我想要的行为?我知道 DynamicTableEntity 但不清楚将其用作基础 class 是否会导致模型属性的行为发生变化。
澄清一下,我并不是说不断摆弄模型或为同一个 table 使用多个客户端模型是一个好习惯,但这绝对是能够偶尔添加一个列而不用担心重新部署可能触及受影响的每个服务很有用 table.
您可以使用 InsertOrMerge 而不是 InsertOrReplace。