Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Could not load file or assembly 'Microsoft.Azure.Documents.Client - Azure-Table-Api

I am trying to use Azure Table Api with dotnet core and I keep getting this exception:

Unhandled Exception: System.IO.FileNotFoundException: Could not load file or assembly 'Microsoft.Azure.Documents.Client, Version=1.20.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'. The system cannot find the file specified.

   at Microsoft.Azure.CosmosDB.Table.CloudTableClient..ctor(StorageUri storageUri, StorageCredentials credentials, TableConnectionPolicy connectionPolicy, Nullable`1 desiredConsistencyLevel)
   at Microsoft.Azure.CosmosDB.Table.CloudStorageAccountExtensions.CreateCloudTableClient(CloudStorageAccount account, TableConnectionPolicy connectionPolicy, Nullable`1 consistencyLevel)
   at Testing.Program.Main(String[] args) in /Desktop/Repos/TestingWow/Testing/Program.cs:line 22

Apparently this is a common exception message. I put my simple code on GitHub just in case. I think I tried every existing StackOverFlow hint or solution but no success. I am not sure what is the source of my problem. I am using dotnet core 2.1.104 on Mac. Any help would be greatly appreciated.

.csproj file:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp2.0</TargetFramework>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Microsoft.Azure.Common" Version="2.1.4" />
    <PackageReference Include="Microsoft.Azure.CosmosDB.Table" Version="1.1.2" />
    <PackageReference Include="Microsoft.Azure.DocumentDB" Version="1.22.0" />
    <PackageReference Include="Microsoft.WindowsAzure.ConfigurationManager" Version="3.2.3" />
  </ItemGroup>
  <ItemGroup>
    <Reference Include="Microsoft.Azure.Storage.Common, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35">
      <HintPath>..\..\..\..\.nuget\packages\microsoft.azure.storage.common\9.0.0.1-preview\lib\netstandard1.3\Microsoft.Azure.Storage.Common.dll</HintPath>
    </Reference>
  </ItemGroup>
</Project>

Simple code:

using Microsoft.Azure.CosmosDB.Table;
using Microsoft.Azure.Storage;

namespace Testing
{
    class Person : TableEntity
    {
        public string Firstname { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var connectionString =
                "DefaultEndpointsProtocol=https;AccountName=accountname;AccountKey=1fgp8C2mImKcQfIFLMfAYBXwOK3LlYsXLyJdktuDEgXgmSCbJlDtd9tBeh2BgfnvGXmgltHFHzNnl7JpCR12Eg==;TableEndpoint=https://hello.table.cosmosdb.azure.com:443/;";

            // Retrieve the storage account from the connection string.
            CloudStorageAccount storageAccount = CloudStorageAccount.Parse(connectionString);

            // Create the table client.
            CloudTableClient tableClient = storageAccount.CreateCloudTableClient();

            // Create the CloudTable object that represents the "people" table.
            CloudTable table = tableClient.GetTableReference("people");

            // Create a new customer entity.
            Person customer1 = new Person {Firstname = "[email protected]"};

            // Create the TableOperation object that inserts the customer entity.
            TableOperation insertOperation = TableOperation.Insert(customer1);

            // Execute the insert operation.
            table.Execute(insertOperation);
        }
    }
}
like image 899
Node.JS Avatar asked May 07 '18 23:05

Node.JS


2 Answers

As I have tested, I think you should uninstall all your package about Microsoft.Azure.CosmosDB.Table.

Change to use WindowsAzure.Storage package to add entity in table.

Also, you need to set the partition key and row key. The following code defines an entity class that uses the customer's first name as the row key and last name as the partition key.

An entity's partition and row key uniquely identify it in the table. Entities with the same partition key can be queried faster than entities with different partition keys, but using diverse partition keys allows for greater scalability of parallel operations.

You could refer to the following code:

In Program:

public static void  Main(string[] args)
        {
            method().Wait();
        }
        static private async Task method()
        {
            var connectionString = "DefaultEndpointsProtocol=https;AccountName=accountname;AccountKey=xFWWad+YMoW/R7P54ppqGMDs7obGYj3ciEjokt+nkomwYfOh6mUcmcvJLV/puGistsKuGCfOwreCfptK1AwAAQ==;EndpointSuffix=core.windows.net";

            CloudStorageAccount storageAccount = CloudStorageAccount.Parse(connectionString);

            CloudTableClient tableClient = storageAccount.CreateCloudTableClient();

            CloudTable table = tableClient.GetTableReference("table1");

            Person customer1 = new Person("Harp", "Walter");
            customer1.Firstname = "[email protected]";
            TableOperation insertOperation = TableOperation.Insert(customer1);

            await table.ExecuteAsync(insertOperation);
        }
        class Person : TableEntity
        {
            public Person(string lastName, string firstName)
            {
                this.PartitionKey = lastName;
                this.RowKey = firstName;
            }

            public Person() { }

            public string Firstname { get; set; }
        }

In csproj:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp2.0</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="WindowsAzure.Storage" Version="9.1.1" />
  </ItemGroup>

</Project>
like image 101
Joey Cai Avatar answered Sep 23 '22 03:09

Joey Cai


Replace Microsoft.Azure.CosmosDB.Table package with Microsoft.Azure.Cosmos.Table. Replace Microsoft.Azure.CosmosDB.Table namespace with Microsoft.Azure.Cosmos.Table.

like image 38
Der_Meister Avatar answered Sep 22 '22 03:09

Der_Meister