我是Windows Azure开发的新手,并且需要在Windows Azure存储表中存储一些数据.
该表实际上仅用于为位于azure存储驱动器上的某些文件提供快速查找机制.
因此,我计划在应用程序启动时填充此表(即在Web应用程序全局应用程序启动时)
而不是尝试维护此表以更改应用程序未运行时驱动器可能发生的更改.或者因为这个驱动器只是一个资源的vhd,我们可能偶尔上传一个新的vhd.
因此,而不是试图维持这一点的麻烦.在每次应用程序启动时重建此表就足够了.
我开始组合一些代码来检查表是否已经存在,如果它确实删除它,然后重新创建一个新表.
var storageAccount = CloudStorageAccount.Parse(ConfigurationManager.ConnectionStrings["AzureStorage"].ConnectionString);
var tableClient = storageAccount.CreateCloudTableClient();
var rmsTable = tableClient.GetTableReference("ResourceManagerStorage");
rmsTable.DeleteIfExists();
rmsTable.Create();
Run Code Online (Sandbox Code Playgroud)
我曾预料到这不起作用.我收到以下错误:
The remote server returned an error: (409) Conflict.
HTTP/1.1 409 Conflict
Cache-Control: no-cache
Transfer-Encoding: chunked
Server: Windows-Azure-Table/1.0 Microsoft-HTTPAPI/2.0
x-ms-request-id: c6baf92e-de47-4a6d-82b3-4faec637a98c
x-ms-version: 2012-02-12
Date: Tue, 19 Mar 2013 17:26:25 GMT
166
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<error xmlns="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
<code>TableBeingDeleted</code>
<message xml:lang="en-US">The specified table is being deleted. Try operation later.
RequestId:c6baf92e-de47-4a6d-82b3-4faec637a98c
Time:2013-03-19T17:26:26.2612698Z</message>
</error>
0
Run Code Online (Sandbox Code Playgroud)
这样做的正确方法是什么?是否有一个事件可以订阅,以便在表被删除时通知您?有关实施此方法的最佳方法的其他建议吗?
我将使用表存储来存储大量blob名称,在单个字符串中,使用一些特殊字符相互附加.这根弦很快就会成为天空火箭.但是特定实体的属性长度是否最大?在我的情况下字符串?
要在Azure存储中实现相对简单的简单分页:使用Windows Azure表存储进行分页.这可以使用延续令牌功能来实现.
但.
这只是严重分页的开始.第一个问题是排序.您无法在Azure表中执行OrderBy.什么是解决这个问题的最佳解决方案?必须对页面进行排序,这就是事实.
第二个问题,当来到分页时,要知道总页数,只有连续令牌功能这是不可能的.要在每个页面上执行".Count()"在我看来效率非常低(例如,因为分区可能位于多个服务器上).
第三个问题是,与第二个问题相关,即使你可以计算你有多少页,如何将计数页面"连接"到实际的连续标记?这对我来说是最大的谜.如何从特定的表行继续?
如果可以提供正确的解决方案,我会非常高兴.我必须承认我也有一个,我会在下面的答案之一中写下来.
我期待在azure表存储中实现页面视图计数器.如果说两个用户同时访问该页面,并且PageViews = 100上的当前值,是否保证更新操作后PageViews = 102?
每当学习新技术时,我都想写出最简单的例子.通常这意味着具有最少引用数量的控制台应用程序.我一直在尝试编写一个读取和写入Azure表存储的应用程序,但收效甚微.我已经使用这个操作指南作为基础,但尝试在Main方法中做所有事情.类似的方法适用于blob存储,但是表存储很麻烦.
我能够使用此代码创建一个表.
static void Main(string[] args)
{
Microsoft.WindowsAzure.Storage.Table.CloudTableClient tableClient =
new Microsoft.WindowsAzure.Storage.Table.CloudTableClient(
new Uri("http://mystorage.table.core.windows.net/"),
new Microsoft.WindowsAzure.Storage.Auth.StorageCredentials("[somename]", "[somekey]"));
CloudTable table = tableClient.GetTableReference("people");
table.CreateIfNotExists();
}
Run Code Online (Sandbox Code Playgroud)
运行此代码后,我可以使用Azure存储资源管理器在我的存储中看到一个表.(还没弄明白如何在manage.windowsazure.com上查看该表.)
但是,如果我尝试插入记录(如前面提到的操作指南中所述),我会收到冲突409 EntityAlreadyExists.Azure Storage Explorer不会在我的表中显示任何记录.
CustomerEntity customer1 = new CustomerEntity("Harp", "Walter");
customer1.Email = "Walter@contoso.com";
customer1.PhoneNumber = "425-555-0101";
TableOperation insertOperation = TableOperation.Insert(customer1);
table.Execute(insertOperation);
Run Code Online (Sandbox Code Playgroud)
此外,我对两个重叠的命名空间感到困惑.Microsoft.WindowsAzure.Storage.Table和Microsoft.WindowsAzure.StorageClient都包含例如CloudTableClient类.为什么有两个客户端命名空间,我应该使用哪个?
编辑结果记录确实存在.只需双击Azure表格资源管理器中的表格,就不会显示表格内容.您必须单击"查询".最后一个问题仍然存在.为什么这两个命名空间?
我正在开发一个小型的网络应用程序,我刚刚开发了我需要开始制定数据库决策的地方.我最初的计划是在Azure上使用MSSQL获取EF Code First,因为它只是简化了使用数据库的过程.但是,在调查Azure上的数据库托管功能时,我发现了Azure Table Storage,它为我打开了NoSQL世界.
虽然互联网上充斥着关于NoSQL功能的喋喋不休,但我设法收集的最大原因之一是NoSQL将整个对象存储在数据库中,而不会将数据分解到各种表中,这对性能有利.虽然这听起来很吸引人,但EF Code First通过自动将对象组合在一起并将对象分离到SQL数据库中而无需开发人员每次都不必担心查询,从而有效地消除了这个问题.
然而,我的主要问题是我找不到任何文档来使用像EF Code First和ASP.NET Identity与NoSQL数据库这样的东西.由于我的应用程序目前使用Identity,我希望避免切换到其他内容.
问:是否可以在Azure表中使用Code First和/或Identity?
编辑:关于我的应用程序的一点点作为极端简化,我的应用程序允许我的用户通过混合和匹配预配置的数据类型来创建自定义配置文件.例如,用户可以将任意数量的Quote对象添加到其配置文件中,然后定义引用的值(即"做你自己;其他人已经被占用了.").或者他们可以使用Movie对象来定义他们喜欢的电影的集合(即"Title:Inception,Year:2010").平均而言,用户可以在其页面上轻松拥有50个或更多此类属性; 它们可以拥有的属性数量没有限制.
使用这个例子,我可以很容易地看到我将如何使用Code First实现它(Profile有一个Quote对象列表和一个Movie对象列表).我还不确定这将如何映射到NoSQL数据库,如Azure Tables.因此,根据我的应用程序的需求,我不确定是否从Code First切换到NoSQL是一个合理的决定,我将丢失的特性和功能.
entity-framework azure azure-table-storage ef-code-first asp.net-identity
我不确定到底在哪里,但我对此有错误的想法.
我试图在第一个实例中使用linq查询azure存储表.但我无法弄清楚它是如何完成的.从各种来源看,我有以下几点:
List<BlogViewModel> blogs = new List<BlogViewModel>();
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(RoleEnvironment.GetConfigurationSettingValue("BlogConnectionString"));
CloudTableClient tableClient = storageAccount.CreateCloudTableClient();
CloudTable blogTable = tableClient.GetTableReference("BlogEntries");
try
{
TableServiceContext tableServiceContext = tableClient.GetTableServiceContext();
TableServiceQuery<BlogEntry> query = (from blog in blogTable.CreateQuery<BlogEntry>()
select blog).AsTableServiceQuery<BlogEntry>(tableServiceContext);
foreach (BlogEntry blog in query)
{
blogs.Add(new BlogViewModel { Body = blog.Body });
}
}
catch { }
Run Code Online (Sandbox Code Playgroud)
在我搞砸之前,我可能已经把它靠近了.要不然,或者我误解了TableService是什么.以下代码对我有用,但我试图将其切换为使用Linq.
List<BlogViewModel> blogs = new List<BlogViewModel>();
var storageAccount = CloudStorageAccount.Parse(RoleEnvironment.GetConfigurationSettingValue("BlogConnectionString"));
var tableClient = storageAccount.CreateCloudTableClient();
CloudTable blogTable = tableClient.GetTableReference("BlogEntries");
TableRequestOptions reqOptions = new TableRequestOptions()
{
MaximumExecutionTime = TimeSpan.FromSeconds(1.5),
RetryPolicy …Run Code Online (Sandbox Code Playgroud) 我正在使用Windows Azure表存储并且有一个简单的要求:添加一个新行,用PartitionKey/RowKey覆盖任何现有行.但是,即使我传入ReplaceOnUpdate选项,保存更改也会引发异常:
tableServiceContext.AddObject(TableName, entity);
tableServiceContext.SaveChangesWithRetries(SaveChangesOptions.ReplaceOnUpdate);
Run Code Online (Sandbox Code Playgroud)
如果实体已存在,则抛出:
System.Data.Services.Client.DataServiceRequestException: An error occurred while processing this request. ---> System.Data.Services.Client.DataServiceClientException: <?xml version="1.0" encoding="utf-8" standalone="yes"?>
<error xmlns="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
<code>EntityAlreadyExists</code>
<message xml:lang="en-AU">The specified entity already exists.</message>
</error>
Run Code Online (Sandbox Code Playgroud)
我是否真的必须首先手动查询现有行并调用DeleteObject它?这似乎很慢.当然有更好的方法吗?
Windows Azure的表存储不支持的十进制数据类型.
一个建议的解决办法是使用自定义属性序列化小数属性作为字符串:
[EntityDataType(PrimitiveTypeKind.String)]
public decimal Quantity { get; set; }
Run Code Online (Sandbox Code Playgroud)
如何实现此EntityDataType自定义属性,以便可以从Windows Azure表存储和检索十进制属性?
我有一个Azure存储表,它有3k +记录.
删除表中所有行的最有效方法是什么?