Neal Rogers
Neal Rogers

Reputation: 500

C# Update Azure Cosmos Db json item with Upsert

I'm (new to CosmosDb) and trying to update an item in an Azure Cosmos db, but it's inserting instead.

The object sent is

public class Bank
{
    public string id { get; set; }
    public string Code { get; set; }
    public string Name { get; set; }
}

I tried passing only the Code and the Name values back (i.e. I did not include the id in the object, which causes an insert (I wanted an update).

I am now including the id which results in an error.

Error returned is:

ResourceType Document is unexpected. ActivityId: a0d50426-c556-4b17-9646-93052699026e, Windows/10.0.19044 documentdb-netcore-sdk/2.16.2

So, it's values after a front end update (only changing the Name value) are:

Code: "FNB"
Name: "aa First Update Test"
id:   "d76ade3d-7d02-46e5-a458-e9f0781bf044"

Cosmos db image

The DAL code:

var documentUri = UriFactory.CreateDocumentUri(DBName, "Banks", bank.Code);
try
{
    Document doc = await client.UpsertDocumentAsync(documentUri, bank);
}

How do I get it to update?

TIA

Upvotes: 0

Views: 4692

Answers (2)

Neal Rogers
Neal Rogers

Reputation: 500

What I needed was the DocumentCollection (DocumentCollection Link) in the Upsert, but I had the Document Link (documentUri) So,

    public async Task<ExBool> UpdateAsyncPOCO(Bank bank)
    {
        
        //  NB:  UpsertDocumentAsync should take the DocumentCollection link, instead of Document link.
        // This is a DocumentLink
        var documentUri = UriFactory.CreateDocumentUri(DBName, "Banks", bank.Code);

        // This is a DocumentCollection
        var CollectionUri = UriFactory.CreateDocumentCollectionUri("demo", "Banks");


        try
        {
            Document doc = await client.UpsertDocumentAsync(CollectionUri, bank);
        }
        catch (Exception ex)
        {
            HandleException(ex);
        }

        return result;
    }

Insert and update work perfectly now. The model and values for the update:

Code: "updated   FNB 2"
Name: "updated   First National Bank 22"
id: "d76ade3d-7d02-46e5-a458-e9f0781bf044"

Similarly, the Insert

Code: "qwerty"
Name: "qwertyuiop"
id: ""

Upvotes: 0

Amjad S.
Amjad S.

Reputation: 1241

Your Code is not clear and dont have enough information.try these functions.

protected DataContext(string endpointUrl, string databaseId,   
                      string masterKey)  
{  
    _databaseId = databaseId;  
    _masterKey = masterKey;  
  
    _databaseUri = UriFactory.CreateDatabaseUri(_databaseId);  
  
    this._client = new DocumentClient(new Uri(endpointUrl), _masterKey);  
  
    this._client.CreateDatabaseIfNotExistsAsync(new Database   
      { Id = _databaseId });  
  
    this._client.CreateDocumentCollectionIfNotExistsAsync(  
      UriFactory.CreateDatabaseUri(_databaseId),   
      new DocumentCollection { Id = CollectionId });  
  
    _databaseCollectionUri = UriFactory.CreateDocumentCollectionUri(  
      _databaseId, CollectionId);  
}  

insert and update using

public async Task<Document> UpsertDocumentAsync(T entity)  
{  
    var result = await this._client.UpsertDocumentAsync(  
    _databaseCollectionUri, entity);  
    return result;  
}  

Or Try please using the nuget Microsoft.Azure.Cosmos;

 string cosmosDbConnectionString = CosmosDbConnectionKey;
                CosmosClient cosmosClient = new CosmosClient(cosmosDbConnectionString);
                var db = CosmosDbNameKey;
                var container = ContainerKey;
                await container.UpsertItemAsync(Model, new PartitionKey(Model.PK));

Upvotes: 1

Related Questions