Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -198,3 +198,10 @@ var records = tableStore.GetByPartitionKey(1, e=>e.Name == "Jim CEO");
```

In this example we get all records in parition "1" where the name is "Jim CEO".

#### Timestamp
Azure Table Storage entities always have a timestamp. If your POCO has a field named Timestamp, that is a `DateTimeOffset`, `DateTime` or `String`, then this property will automatically be hydrated wit the timestamp provided by Azure Table Storage.

Modifications to the Timestamp property do not get persisited. This is exactly how it works with the Azure Table Storage SDK.

Considerations for taking a similar approach to ETag are being considered.
5 changes: 4 additions & 1 deletion src/TableStorage.Abstractions.POCO.Tests/Employee.cs
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
namespace TableStorage.Abstractions.POCO.Tests
using System;

namespace TableStorage.Abstractions.POCO.Tests
{
public class Employee
{
public int CompanyId { get; set; }
public int Id { get; set; }
public string Name { get; set; }
public Department Department { get; set; }
public DateTimeOffset Timestamp { get; set; }
}
}
56 changes: 56 additions & 0 deletions src/TableStorage.Abstractions.POCO.Tests/PocoTableStoreTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,25 @@ public void insert_record()
Assert.AreEqual(4, tableStore.GetRecordCount());
}

[TestMethod]
public void insert_record_with_timestamp_ignores_user_provided_timestamp_value()
{
var employee = new Employee
{
Name = "Test",
CompanyId = 99445,
Id = 991122,
Department = new Department { Id = 5, Name = "Test" },
Timestamp = new DateTimeOffset(2001, 1, 1, 1, 1, 1, TimeSpan.Zero)
};
tableStore.Insert(employee);

var fromDb = tableStore.GetRecord(99445, 991122);

Assert.AreNotEqual(employee.Timestamp, fromDb.Timestamp);

}


[TestMethod]
public void insert_or_replace_record_inserts_when_record_is_new()
Expand Down Expand Up @@ -211,6 +230,13 @@ public void get_record()
Assert.IsNotNull(record);
}

[TestMethod]
public void get_record_populates_timestamp()
{
var record = tableStore.GetRecord("1", "1");
Assert.AreNotEqual(default(DateTimeOffset), record.Timestamp);
}

[TestMethod]
public void get_record_with_no_results()
{
Expand Down Expand Up @@ -404,6 +430,16 @@ public void get_records_by_row_key()
Assert.AreEqual(2, records.Count());
}

[TestMethod]
public void get_records_by_row_key_contain_hydrated_timestamp()
{
var records = tableStore.GetByRowKey("1");
foreach (var record in records)
{
Assert.AreNotEqual(default(DateTimeOffset), record.Timestamp);
}
}

[TestMethod]
public void get_records_by_row_key_and_filter()
{
Expand Down Expand Up @@ -635,6 +671,26 @@ public void update_record()
Assert.AreEqual("Mr. Jim CEO", record.Name);
}

[TestMethod]
public void update_record_updates_timestamp()
{
var employee = new Employee
{
CompanyId = 1,
Id = 1,
Name = "Mr. Jim CEO",
Department = new Department { Id = 22, Name = "Executive" }
};
tableStore.Update(employee);
var record = tableStore.GetRecord(1, 1);
var timestamp1 = record.Timestamp;
Task.Delay(5).Wait();
tableStore.Update(employee);
record = tableStore.GetRecord(1, 1);
var timestamp2 = record.Timestamp;
Assert.AreNotEqual(timestamp1, timestamp2);
}

[TestMethod]
public void update_record_wildcard_etag()
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,13 +40,13 @@
</PropertyGroup>
<ItemGroup>
<Reference Include="FluentValidation, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7de548da2fbae0f0, processorArchitecture=MSIL">
<HintPath>..\packages\FluentValidation.8.6.1\lib\net45\FluentValidation.dll</HintPath>
<HintPath>..\packages\FluentValidation.8.6.2\lib\net45\FluentValidation.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Azure.Cosmos.Table, Version=1.0.6.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Azure.Cosmos.Table.1.0.6\lib\netstandard2.0\Microsoft.Azure.Cosmos.Table.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Azure.DocumentDB.Core, Version=2.9.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Azure.DocumentDB.Core.2.9.3\lib\netstandard1.6\Microsoft.Azure.DocumentDB.Core.dll</HintPath>
<Reference Include="Microsoft.Azure.DocumentDB.Core, Version=2.10.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Azure.DocumentDB.Core.2.10.0\lib\netstandard1.6\Microsoft.Azure.DocumentDB.Core.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Azure.KeyVault.Core, Version=3.0.5.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Azure.KeyVault.Core.3.0.5\lib\net461\Microsoft.Azure.KeyVault.Core.dll</HintPath>
Expand Down Expand Up @@ -305,8 +305,8 @@
<Reference Include="TableStorage.Abstractions, Version=3.1.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\TableStorage.Abstractions.3.1.0\lib\netstandard2.0\TableStorage.Abstractions.dll</HintPath>
</Reference>
<Reference Include="TableStorage.Abstractions.TableEntityConverters, Version=1.1.8.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\TableStorage.Abstractions.TableEntityConverters.1.1.8\lib\net462\TableStorage.Abstractions.TableEntityConverters.dll</HintPath>
<Reference Include="TableStorage.Abstractions.TableEntityConverters, Version=1.2.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\TableStorage.Abstractions.TableEntityConverters.1.2.0\lib\net462\TableStorage.Abstractions.TableEntityConverters.dll</HintPath>
</Reference>
<Reference Include="Useful.Extensions, Version=3.0.1.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Useful.Extensions.3.0.1\lib\netstandard2.0\Useful.Extensions.dll</HintPath>
Expand Down Expand Up @@ -339,9 +339,9 @@
<Error Condition="!Exists('..\packages\MSTest.TestAdapter.2.1.0\build\net45\MSTest.TestAdapter.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\MSTest.TestAdapter.2.1.0\build\net45\MSTest.TestAdapter.props'))" />
<Error Condition="!Exists('..\packages\MSTest.TestAdapter.2.1.0\build\net45\MSTest.TestAdapter.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\MSTest.TestAdapter.2.1.0\build\net45\MSTest.TestAdapter.targets'))" />
<Error Condition="!Exists('..\packages\NETStandard.Library.2.0.3\build\netstandard2.0\NETStandard.Library.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\NETStandard.Library.2.0.3\build\netstandard2.0\NETStandard.Library.targets'))" />
<Error Condition="!Exists('..\packages\Microsoft.Azure.DocumentDB.Core.2.9.3\build\Microsoft.Azure.DocumentDB.Core.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.Azure.DocumentDB.Core.2.9.3\build\Microsoft.Azure.DocumentDB.Core.targets'))" />
<Error Condition="!Exists('..\packages\Microsoft.Azure.DocumentDB.Core.2.10.0\build\Microsoft.Azure.DocumentDB.Core.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.Azure.DocumentDB.Core.2.10.0\build\Microsoft.Azure.DocumentDB.Core.targets'))" />
</Target>
<Import Project="..\packages\MSTest.TestAdapter.2.1.0\build\net45\MSTest.TestAdapter.targets" Condition="Exists('..\packages\MSTest.TestAdapter.2.1.0\build\net45\MSTest.TestAdapter.targets')" />
<Import Project="..\packages\NETStandard.Library.2.0.3\build\netstandard2.0\NETStandard.Library.targets" Condition="Exists('..\packages\NETStandard.Library.2.0.3\build\netstandard2.0\NETStandard.Library.targets')" />
<Import Project="..\packages\Microsoft.Azure.DocumentDB.Core.2.9.3\build\Microsoft.Azure.DocumentDB.Core.targets" Condition="Exists('..\packages\Microsoft.Azure.DocumentDB.Core.2.9.3\build\Microsoft.Azure.DocumentDB.Core.targets')" />
<Import Project="..\packages\Microsoft.Azure.DocumentDB.Core.2.10.0\build\Microsoft.Azure.DocumentDB.Core.targets" Condition="Exists('..\packages\Microsoft.Azure.DocumentDB.Core.2.10.0\build\Microsoft.Azure.DocumentDB.Core.targets')" />
</Project>
2 changes: 1 addition & 1 deletion src/TableStorage.Abstractions.POCO.Tests/app.config
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.Azure.DocumentDB.Core" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-2.9.3.0" newVersion="2.9.3.0" />
<bindingRedirect oldVersion="0.0.0.0-2.10.0.0" newVersion="2.10.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.OData.Core" publicKeyToken="31bf3856ad364e35" culture="neutral" />
Expand Down
6 changes: 3 additions & 3 deletions src/TableStorage.Abstractions.POCO.Tests/packages.config
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="FluentValidation" version="8.6.1" targetFramework="net462" />
<package id="FluentValidation" version="8.6.2" targetFramework="net462" />
<package id="Microsoft.Azure.Cosmos.Table" version="1.0.6" targetFramework="net462" />
<package id="Microsoft.Azure.DocumentDB.Core" version="2.9.3" targetFramework="net462" />
<package id="Microsoft.Azure.DocumentDB.Core" version="2.10.0" targetFramework="net462" />
<package id="Microsoft.Azure.KeyVault.Core" version="3.0.5" targetFramework="net462" />
<package id="Microsoft.CSharp" version="4.7.0" targetFramework="net462" />
<package id="Microsoft.Data.Edm" version="5.8.4" targetFramework="net462" />
Expand Down Expand Up @@ -92,6 +92,6 @@
<package id="System.Xml.ReaderWriter" version="4.3.1" targetFramework="net462" />
<package id="System.Xml.XDocument" version="4.3.0" targetFramework="net462" />
<package id="TableStorage.Abstractions" version="3.1.0" targetFramework="net462" />
<package id="TableStorage.Abstractions.TableEntityConverters" version="1.1.8" targetFramework="net462" />
<package id="TableStorage.Abstractions.TableEntityConverters" version="1.2.0" targetFramework="net462" />
<package id="Useful.Extensions" version="3.0.1" targetFramework="net462" />
</packages>
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<Version>2.3.1</Version>
<Version>2.4</Version>
<Authors>Giovanni Galbo</Authors>
<Company>Giovanni Galbo</Company>
<Description>A repository wrapper for Azure Table Storage that uses POCOs (Plain Old CLR Objects) instead of objects that implemeent ITableEntity.
Expand All @@ -19,18 +19,18 @@ The library will convert simple properties to fields in Azure Table Storage. Com
<PackageProjectUrl>https://github.com/giometrix/TableStorage.Abstractions.POCO</PackageProjectUrl>
<RepositoryUrl>https://github.com/giometrix/TableStorage.Abstractions.POCO</RepositoryUrl>
<PackageTags>table-storage azure-table-storage poco table-entities tableentity</PackageTags>
<PackageReleaseNotes>update nuget packages</PackageReleaseNotes>
<PackageReleaseNotes>auto-populate timestamp field</PackageReleaseNotes>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<PackageLicenseExpression>MIT</PackageLicenseExpression>
<AssemblyVersion>2.3.1.0</AssemblyVersion>
<FileVersion>2.3.1.0</FileVersion>
<AssemblyVersion>2.4.0.0</AssemblyVersion>
<FileVersion>2.4.0.0</FileVersion>
<PackageIcon>xtensible-x.png</PackageIcon>
<PackageIconUrl />
</PropertyGroup>

<ItemGroup>
<PackageReference Include="TableStorage.Abstractions" Version="3.1.0" />
<PackageReference Include="TableStorage.Abstractions.TableEntityConverters" Version="1.1.8" />
<PackageReference Include="TableStorage.Abstractions.TableEntityConverters" Version="1.2.0" />
</ItemGroup>

<ItemGroup>
Expand Down