Home > database >  AspNetIdentityDocumentDB and Cross partition query is required but disabled
AspNetIdentityDocumentDB and Cross partition query is required but disabled

Time:09-29

I have an app that uses CosmosDb as the database and using AspNetIdentityDocument. When I call var result = await _signInManager.PasswordSignInAsync(model.UserName, model.Password, model.RememberMe, false), i get the error Cross partition query is required but disabled. Please set x-ms-documentdb-query-enablecrosspartition to true, specify x-ms-documentdb-partitionkey

void InitializeDocumentClient(DocumentClient client) code attempts to create the container if not there. It works for the creating the container on my CossmosDb emultated store but fails on the Azure store requiring a partition key! My app works on the emulated store!

Program.cs

builder.Services.AddDefaultDocumentClientForIdentity(
            builder.Configuration.GetValue<Uri>("DocumentDbClient:EndpointUri"),
            builder.Configuration.GetValue<string>("DocumentDbClient:AuthorizationKey"),
            afterCreation: InitializeDocumentClient);

builder.Services.AddIdentity<ApplicationUser, DocumentDbIdentityRole>()
.AddDocumentDbStores(options =>
{
    options.UserStoreDocumentCollection = "AspNetIdentity";
    options.Database = "RNPbooking";
})
.AddDefaultTokenProviders();




void InitializeDocumentClient(DocumentClient client)

{ try { var db = client.ReadDatabaseAsync(UriFactory.CreateDatabaseUri("RNPbooking")).Result; } catch (AggregateException ae) { ae.Handle(ex => { if (ex.GetType() == typeof(DocumentClientException) && ((DocumentClientException)ex).StatusCode == HttpStatusCode.NotFound) { var db = client.CreateDatabaseAsync(new Microsoft.Azure.Documents.Database() { Id = "RNPbooking" }).Result; return true; }

        return false;
    });
}

try
{
    var collection = client.ReadDocumentCollectionAsync(UriFactory.CreateDocumentCollectionUri("RNPbooking", "AspNetIdentity")).Result;
}
catch (AggregateException ae)
{
    ae.Handle(ex =>
    {
        if (ex.GetType() == typeof(DocumentClientException) && ((DocumentClientException)ex).StatusCode == HttpStatusCode.NotFound)
        {
            DocumentCollection collection = new DocumentCollection()
            {
                Id = "AspNetIdentity"
            };
            
            collection = client.CreateDocumentCollectionAsync(UriFactory.CreateDatabaseUri("RNPbooking"),collection).Result;

            return true;
        }

        return false;
    });

} }

Controller

[Authorize(Roles = "Admin)]
public class AdminController : Controller
{
    private readonly UserManager<ApplicationUser> _userManager;
    private readonly SignInManager<ApplicationUser> _signInManager;
    
    public CosmosClient _client;

    public AdminController(
        UserManager<ApplicationUser> userManager,
        SignInManager<ApplicationUser> signInManager,

        )
    
    {
        _userManager = userManager;
        _signInManager = signInManager;
        
    }

CodePudding user response:

You need to fill in CreateDocumentCollectionUri method with FeedOptions object as a parameter

 UriFactory.CreateDocumentCollectionUri(DatabaseId, CollectionId),new FeedOptions { EnableCrossPartitionQuery=true})

CodePudding user response:

This error means the library you are using is performing a Document Query in their code at some point, it is not related to the creation of the Database or Collection.

You must have in your code some code that is doing CreateDocumentQuery, that code is missing:

 new FeedOptions { EnableCrossPartitionQuery = true };

Reference: https://stackoverflow.com/a/46175970/5641598

  • Related