您是否见过这条异常消息?
分区路由信息无法从查询中提取出来 以32位进程运行。要完成您的查询并避免这种情况 例外,确保您的主机进程是64位。对于可执行文件 应用程序,这可以通过取消选中"首选32位" 项目属性窗口中的选项,在“构建”选项卡上。对于VSTest 基于测试项目,可以通过选择Test-> Test来完成 设置 - >默认处理器体系结构为X64,来自Visual Studio 测试菜单选项。对于本地部署的ASP.NET Web应用程序,这个 可以通过检查"使用64位版本的IIS Express来完成 网站和项目",在工具 - >选项 - >项目和 解决方案 - > Web项目。
当我想从DocumentDB读取文档时,我收到此异常消息。 C#中用于检索文档的代码如下(没有检查FeedOption):
FeedOptions queryOptions = new FeedOptions { EnableCrossPartitionQuery = true };
var conv = db.Client.CreateDocumentQuery<Model.Conversation>(
UriFactory.CreateDocumentCollectionUri(db.DatabaseName, db.CollectionName), queryOptions)
.Where(f => f.Id == "conversationId");
// the exception happens here
foreach(Conversation f in conv)
{
Debug.Print(f.Name);
}
在上面,db
是一个存储库,我确信Client
已经正确启动,因为我可以同时将文档插入DocumentDB。
此外,您还可以看到对话模型:
public class Conversation
{
[JsonProperty(PropertyName = "id")]
public string Id { get; set; }
public string Name { get; set; }
[JsonProperty("cid")]
public string CID { get; set; } // defined as a partition key
}
我应该提一下DocumentDB中有一个Id == "conversationId"
的文档,下面的代码在这种情况下工作,但它不是我想在Name
属性上查询的解决方案,不仅仅是Id
:
Document doc = await db.Client.ReadDocumentAsync(
UriFactory.CreateDocumentUri(db.DatabaseName, db.CollectionName, "conversationId"),
new RequestOptions { PartitionKey = new PartitionKey("partitionKey") });
Conversation conv = (Conversation)(dynamic)doc;
答案 0 :(得分:2)
汇编版本问题和例外也显示了修复的可能解决方案。
有三种可能的替代方法用于修复它。
答案 1 :(得分:2)
我找到了解决方案。在问题中,使用的是1.11版本的Microsoft.Azure.Document库。正如我在this link中发现的那样,CreateDocumentQuery
已被淘汰,显然api已被更改。因此,当我降级到版本1.10时,每个人都可以正常工作。因此,我很高兴!
因此,版本1.11中已CreateDocumentQuery
已废弃,您应为每个集合定义一个partitionKey,其结果是您不能再使用CreateDocumentQuery
,除非您降级为1.10或更低版本。
此外,我认为这是该版本中的一个错误,应该报告。