# AgentDefinitionStoreContract

> Tracon documentation. Tracon is a .NET package family that adds a control
> plane on Microsoft Agent Framework, published as NuGet packages that run
> inside your own ASP.NET Core application.
>
> Page: https://tracon.dev/api/tracon.testing.contracts.storage.agentdefinitionstorecontract/
> Summary: AgentDefinitionStoreContract: Behavior tests for the IAgentDefinitionStore contract.

<div class="api-provenance">Namespace Tracon.Testing.Contracts.Storage · Assembly <code>Tracon.Testing.Contracts.Xunit.dll</code></div>

Behavior tests for the [IAgentDefinitionStore](/api/tracon.iagentdefinitionstore/) contract.

```csharp
public abstract class AgentDefinitionStoreContract : TenantIsolationContract<IAgentDefinitionStore>, IAsyncLifetime, IAsyncDisposable
```

<dl class="api-relations"><dt>Inheritance</dt><dd><a href="https://learn.microsoft.com/dotnet/api/system.object">object</a> ← <a href="/api/tracon.testing.contracts.storage.storecancellationcontract-1/">StoreCancellationContract&lt;IAgentDefinitionStore&gt;</a> ← <a href="/api/tracon.testing.contracts.storage.tenantisolationcontract-1/">TenantIsolationContract&lt;IAgentDefinitionStore&gt;</a> ← <a href="/api/tracon.testing.contracts.storage.agentdefinitionstorecontract/">AgentDefinitionStoreContract</a></dd><dt>Implements</dt><dd>IAsyncLifetime, <a href="https://learn.microsoft.com/dotnet/api/system.iasyncdisposable">IAsyncDisposable</a></dd><dt>Inherited Members</dt><dd><a href="/api/tracon.testing.contracts.storage.tenantisolationcontract-1/#Tracon_Testing_Contracts_Storage_TenantIsolationContract_1_TenantA">TenantIsolationContract&lt;IAgentDefinitionStore&gt;.TenantA</a>, <a href="/api/tracon.testing.contracts.storage.tenantisolationcontract-1/#Tracon_Testing_Contracts_Storage_TenantIsolationContract_1_TenantB">TenantIsolationContract&lt;IAgentDefinitionStore&gt;.TenantB</a>, <a href="/api/tracon.testing.contracts.storage.tenantisolationcontract-1/#Tracon_Testing_Contracts_Storage_TenantIsolationContract_1_UseAmbientTenant_Tracon_Testing_Contracts_Storage_MutableTenantContext_">TenantIsolationContract&lt;IAgentDefinitionStore&gt;.UseAmbientTenant(MutableTenantContext)</a>, <a href="/api/tracon.testing.contracts.storage.tenantisolationcontract-1/#Tracon_Testing_Contracts_Storage_TenantIsolationContract_1_SeedAsync_System_String_System_String_System_Threading_CancellationToken_">TenantIsolationContract&lt;IAgentDefinitionStore&gt;.SeedAsync(string, string, CancellationToken)</a>, <a href="/api/tracon.testing.contracts.storage.tenantisolationcontract-1/#Tracon_Testing_Contracts_Storage_TenantIsolationContract_1_ExistsAsync_System_String_System_Object_">TenantIsolationContract&lt;IAgentDefinitionStore&gt;.ExistsAsync(string, object)</a>, <a href="/api/tracon.testing.contracts.storage.tenantisolationcontract-1/#Tracon_Testing_Contracts_Storage_TenantIsolationContract_1_CountAsync_System_String_System_Threading_CancellationToken_">TenantIsolationContract&lt;IAgentDefinitionStore&gt;.CountAsync(string, CancellationToken)</a>, <a href="/api/tracon.testing.contracts.storage.tenantisolationcontract-1/#Tracon_Testing_Contracts_Storage_TenantIsolationContract_1_TryDeleteAsync_System_String_System_Object_">TenantIsolationContract&lt;IAgentDefinitionStore&gt;.TryDeleteAsync(string, object)</a>, <a href="/api/tracon.testing.contracts.storage.tenantisolationcontract-1/#Tracon_Testing_Contracts_Storage_TenantIsolationContract_1_TryOverwriteAsync_System_String_System_String_">TenantIsolationContract&lt;IAgentDefinitionStore&gt;.TryOverwriteAsync(string, string)</a>, <a href="/api/tracon.testing.contracts.storage.tenantisolationcontract-1/#Tracon_Testing_Contracts_Storage_TenantIsolationContract_1_CancellableReadAsync_System_Threading_CancellationToken_">TenantIsolationContract&lt;IAgentDefinitionStore&gt;.CancellableReadAsync(CancellationToken)</a>, <a href="/api/tracon.testing.contracts.storage.tenantisolationcontract-1/#Tracon_Testing_Contracts_Storage_TenantIsolationContract_1_CancellableWriteAsync_System_Threading_CancellationToken_">TenantIsolationContract&lt;IAgentDefinitionStore&gt;.CancellableWriteAsync(CancellationToken)</a>, <a href="/api/tracon.testing.contracts.storage.tenantisolationcontract-1/#Tracon_Testing_Contracts_Storage_TenantIsolationContract_1_WroteAnythingAsync">TenantIsolationContract&lt;IAgentDefinitionStore&gt;.WroteAnythingAsync()</a>, <a href="/api/tracon.testing.contracts.storage.tenantisolationcontract-1/#Tracon_Testing_Contracts_Storage_TenantIsolationContract_1_Tenant_cannot_read_another_tenants_record">TenantIsolationContract&lt;IAgentDefinitionStore&gt;.Tenant_cannot_read_another_tenants_record()</a>, <a href="/api/tracon.testing.contracts.storage.tenantisolationcontract-1/#Tracon_Testing_Contracts_Storage_TenantIsolationContract_1_Tenant_reads_its_own_record">TenantIsolationContract&lt;IAgentDefinitionStore&gt;.Tenant_reads_its_own_record()</a>, <a href="/api/tracon.testing.contracts.storage.tenantisolationcontract-1/#Tracon_Testing_Contracts_Storage_TenantIsolationContract_1_Tenant_does_not_see_another_tenants_record_in_the_list">TenantIsolationContract&lt;IAgentDefinitionStore&gt;.Tenant_does_not_see_another_tenants_record_in_the_list()</a>, <a href="/api/tracon.testing.contracts.storage.tenantisolationcontract-1/#Tracon_Testing_Contracts_Storage_TenantIsolationContract_1_Tenant_cannot_delete_another_tenants_record">TenantIsolationContract&lt;IAgentDefinitionStore&gt;.Tenant_cannot_delete_another_tenants_record()</a>, <a href="/api/tracon.testing.contracts.storage.tenantisolationcontract-1/#Tracon_Testing_Contracts_Storage_TenantIsolationContract_1_Same_name_lives_independently_across_two_tenants">TenantIsolationContract&lt;IAgentDefinitionStore&gt;.Same_name_lives_independently_across_two_tenants()</a>, <a href="/api/tracon.testing.contracts.storage.tenantisolationcontract-1/#Tracon_Testing_Contracts_Storage_TenantIsolationContract_1_AmbientTenant">TenantIsolationContract&lt;IAgentDefinitionStore&gt;.AmbientTenant</a>, <a href="/api/tracon.testing.contracts.storage.storecancellationcontract-1/#Tracon_Testing_Contracts_Storage_StoreCancellationContract_1_CreateStoreAsync">StoreCancellationContract&lt;IAgentDefinitionStore&gt;.CreateStoreAsync()</a>, <a href="/api/tracon.testing.contracts.storage.storecancellationcontract-1/#Tracon_Testing_Contracts_Storage_StoreCancellationContract_1_InitializeAsync">StoreCancellationContract&lt;IAgentDefinitionStore&gt;.InitializeAsync()</a>, <a href="/api/tracon.testing.contracts.storage.storecancellationcontract-1/#Tracon_Testing_Contracts_Storage_StoreCancellationContract_1_DisposeAsync">StoreCancellationContract&lt;IAgentDefinitionStore&gt;.DisposeAsync()</a>, <a href="/api/tracon.testing.contracts.storage.storecancellationcontract-1/#Tracon_Testing_Contracts_Storage_StoreCancellationContract_1_OnDisposeAsync">StoreCancellationContract&lt;IAgentDefinitionStore&gt;.OnDisposeAsync()</a>, <a href="/api/tracon.testing.contracts.storage.storecancellationcontract-1/#Tracon_Testing_Contracts_Storage_StoreCancellationContract_1_CancellableReadAsync_System_Threading_CancellationToken_">StoreCancellationContract&lt;IAgentDefinitionStore&gt;.CancellableReadAsync(CancellationToken)</a>, <a href="/api/tracon.testing.contracts.storage.storecancellationcontract-1/#Tracon_Testing_Contracts_Storage_StoreCancellationContract_1_CancellableWriteAsync_System_Threading_CancellationToken_">StoreCancellationContract&lt;IAgentDefinitionStore&gt;.CancellableWriteAsync(CancellationToken)</a>, <a href="/api/tracon.testing.contracts.storage.storecancellationcontract-1/#Tracon_Testing_Contracts_Storage_StoreCancellationContract_1_WroteAnythingAsync">StoreCancellationContract&lt;IAgentDefinitionStore&gt;.WroteAnythingAsync()</a>, <a href="/api/tracon.testing.contracts.storage.storecancellationcontract-1/#Tracon_Testing_Contracts_Storage_StoreCancellationContract_1_Canceled_token_throws_on_read">StoreCancellationContract&lt;IAgentDefinitionStore&gt;.Canceled_token_throws_on_read()</a>, <a href="/api/tracon.testing.contracts.storage.storecancellationcontract-1/#Tracon_Testing_Contracts_Storage_StoreCancellationContract_1_The_write_this_contract_checks_can_be_read_back">StoreCancellationContract&lt;IAgentDefinitionStore&gt;.The_write_this_contract_checks_can_be_read_back()</a>, <a href="/api/tracon.testing.contracts.storage.storecancellationcontract-1/#Tracon_Testing_Contracts_Storage_StoreCancellationContract_1_Canceled_token_throws_on_write_and_leaves_no_trace">StoreCancellationContract&lt;IAgentDefinitionStore&gt;.Canceled_token_throws_on_write_and_leaves_no_trace()</a>, <a href="/api/tracon.testing.contracts.storage.storecancellationcontract-1/#Tracon_Testing_Contracts_Storage_StoreCancellationContract_1_Store">StoreCancellationContract&lt;IAgentDefinitionStore&gt;.Store</a>, <a href="https://learn.microsoft.com/dotnet/api/system.object.gettype">object.GetType()</a>, <a href="https://learn.microsoft.com/dotnet/api/system.object.memberwiseclone">object.MemberwiseClone()</a>, <a href="https://learn.microsoft.com/dotnet/api/system.object.tostring">object.ToString()</a>, <a href="https://learn.microsoft.com/dotnet/api/system.object.equals#system-object-equals(system-object)">object.Equals(object?)</a>, <a href="https://learn.microsoft.com/dotnet/api/system.object.equals#system-object-equals(system-object-system-object)">object.Equals(object?, object?)</a>, <a href="https://learn.microsoft.com/dotnet/api/system.object.referenceequals">object.ReferenceEquals(object?, object?)</a>, <a href="https://learn.microsoft.com/dotnet/api/system.object.gethashcode">object.GetHashCode()</a></dd></dl>

## Remarks

These tests run against **every implementation**. A behavior
difference between the in-memory store and the PostgreSQL store is a bug;
this class catches that difference.

## Constructors

### <a id="Tracon_Testing_Contracts_Storage_AgentDefinitionStoreContract__ctor"></a> AgentDefinitionStoreContract\(\)

```csharp
protected AgentDefinitionStoreContract()
```

## Methods

### <a id="Tracon_Testing_Contracts_Storage_AgentDefinitionStoreContract_Concurrent_first_saves_of_a_new_name_get_distinct_versions"></a> Concurrent\_first\_saves\_of\_a\_new\_name\_get\_distinct\_versions\(\)

```csharp
[Fact]
public Task Concurrent_first_saves_of_a_new_name_get_distinct_versions()
```

#### Returns

 [Task](https://learn.microsoft.com/dotnet/api/system.threading.tasks.task)

### <a id="Tracon_Testing_Contracts_Storage_AgentDefinitionStoreContract_Concurrent_saves_of_one_name_get_distinct_versions_across_a_delete"></a> Concurrent\_saves\_of\_one\_name\_get\_distinct\_versions\_across\_a\_delete\(\)

```csharp
[Fact]
public Task Concurrent_saves_of_one_name_get_distinct_versions_across_a_delete()
```

#### Returns

 [Task](https://learn.microsoft.com/dotnet/api/system.threading.tasks.task)

### <a id="Tracon_Testing_Contracts_Storage_AgentDefinitionStoreContract_CountAsync_System_String_System_Threading_CancellationToken_"></a> CountAsync\(string, CancellationToken\)

Reports how many records the given tenant sees through the listing endpoint.

```csharp
protected override ValueTask<int> CountAsync(string tenantId, CancellationToken cancellationToken)
```

#### Parameters

`tenantId` [string](https://learn.microsoft.com/dotnet/api/system.string)

The reading tenant.

`cancellationToken` [CancellationToken](https://learn.microsoft.com/dotnet/api/system.threading.cancellationtoken)

The token every store call inside the hook must be handed; see
[TenantIsolationContract.SeedAsync](/api/tracon.testing.contracts.storage/).

#### Returns

 [ValueTask](https://learn.microsoft.com/dotnet/api/system.threading.tasks.valuetask\-1)<[int](https://learn.microsoft.com/dotnet/api/system.int32)\>

The number of records seen.

### <a id="Tracon_Testing_Contracts_Storage_AgentDefinitionStoreContract_DeleteAsync_of_a_name_that_never_existed_does_not_start_a_numbering"></a> DeleteAsync\_of\_a\_name\_that\_never\_existed\_does\_not\_start\_a\_numbering\(\)

```csharp
[Fact]
public Task DeleteAsync_of_a_name_that_never_existed_does_not_start_a_numbering()
```

#### Returns

 [Task](https://learn.microsoft.com/dotnet/api/system.threading.tasks.task)

### <a id="Tracon_Testing_Contracts_Storage_AgentDefinitionStoreContract_DeleteAsync_removes_all_versions"></a> DeleteAsync\_removes\_all\_versions\(\)

```csharp
[Fact]
public Task DeleteAsync_removes_all_versions()
```

#### Returns

 [Task](https://learn.microsoft.com/dotnet/api/system.threading.tasks.task)

### <a id="Tracon_Testing_Contracts_Storage_AgentDefinitionStoreContract_Each_tenants_version_counter_is_its_own"></a> Each\_tenants\_version\_counter\_is\_its\_own\(\)

```csharp
[Fact]
public Task Each_tenants_version_counter_is_its_own()
```

#### Returns

 [Task](https://learn.microsoft.com/dotnet/api/system.threading.tasks.task)

### <a id="Tracon_Testing_Contracts_Storage_AgentDefinitionStoreContract_ExistsAsync_System_String_System_Object_"></a> ExistsAsync\(string, object\)

Reports whether the record is visible from the given tenant's viewpoint.

```csharp
protected override ValueTask<bool> ExistsAsync(string tenantId, object key)
```

#### Parameters

`tenantId` [string](https://learn.microsoft.com/dotnet/api/system.string)

The reading tenant.

`key` [object](https://learn.microsoft.com/dotnet/api/system.object)

The key returned by [TenantIsolationContract.SeedAsync](/api/tracon.testing.contracts.storage/).

#### Returns

 [ValueTask](https://learn.microsoft.com/dotnet/api/system.threading.tasks.valuetask\-1)<[bool](https://learn.microsoft.com/dotnet/api/system.boolean)\>

[true](https://learn.microsoft.com/dotnet/csharp/language-reference/builtin-types/bool) if the record is visible.

### <a id="Tracon_Testing_Contracts_Storage_AgentDefinitionStoreContract_GetAsync_for_a_missing_definition_returns_null"></a> GetAsync\_for\_a\_missing\_definition\_returns\_null\(\)

```csharp
[Fact]
public Task GetAsync_for_a_missing_definition_returns_null()
```

#### Returns

 [Task](https://learn.microsoft.com/dotnet/api/system.threading.tasks.task)

### <a id="Tracon_Testing_Contracts_Storage_AgentDefinitionStoreContract_GetVersionAsync_for_a_missing_agent_returns_null"></a> GetVersionAsync\_for\_a\_missing\_agent\_returns\_null\(\)

```csharp
[Fact]
public Task GetVersionAsync_for_a_missing_agent_returns_null()
```

#### Returns

 [Task](https://learn.microsoft.com/dotnet/api/system.threading.tasks.task)

### <a id="Tracon_Testing_Contracts_Storage_AgentDefinitionStoreContract_GetVersionAsync_for_a_missing_version_returns_null"></a> GetVersionAsync\_for\_a\_missing\_version\_returns\_null\(\)

```csharp
[Fact]
public Task GetVersionAsync_for_a_missing_version_returns_null()
```

#### Returns

 [Task](https://learn.microsoft.com/dotnet/api/system.threading.tasks.task)

### <a id="Tracon_Testing_Contracts_Storage_AgentDefinitionStoreContract_GetVersionAsync_returns_the_requested_version"></a> GetVersionAsync\_returns\_the\_requested\_version\(\)

```csharp
[Fact]
public Task GetVersionAsync_returns_the_requested_version()
```

#### Returns

 [Task](https://learn.microsoft.com/dotnet/api/system.threading.tasks.task)

### <a id="Tracon_Testing_Contracts_Storage_AgentDefinitionStoreContract_ListAsync_orders_by_name"></a> ListAsync\_orders\_by\_name\(\)

```csharp
[Fact]
public Task ListAsync_orders_by_name()
```

#### Returns

 [Task](https://learn.microsoft.com/dotnet/api/system.threading.tasks.task)

### <a id="Tracon_Testing_Contracts_Storage_AgentDefinitionStoreContract_ListVersionsAsync_orders_newest_to_oldest"></a> ListVersionsAsync\_orders\_newest\_to\_oldest\(\)

```csharp
[Fact]
public Task ListVersionsAsync_orders_newest_to_oldest()
```

#### Returns

 [Task](https://learn.microsoft.com/dotnet/api/system.threading.tasks.task)

### <a id="Tracon_Testing_Contracts_Storage_AgentDefinitionStoreContract_One_tenants_delete_does_not_move_another_tenants_numbering"></a> One\_tenants\_delete\_does\_not\_move\_another\_tenants\_numbering\(\)

```csharp
[Fact]
public Task One_tenants_delete_does_not_move_another_tenants_numbering()
```

#### Returns

 [Task](https://learn.microsoft.com/dotnet/api/system.threading.tasks.task)

### <a id="Tracon_Testing_Contracts_Storage_AgentDefinitionStoreContract_RollbackAsync_after_a_recreate_continues_the_numbering"></a> RollbackAsync\_after\_a\_recreate\_continues\_the\_numbering\(\)

```csharp
[Fact]
public Task RollbackAsync_after_a_recreate_continues_the_numbering()
```

#### Returns

 [Task](https://learn.microsoft.com/dotnet/api/system.threading.tasks.task)

### <a id="Tracon_Testing_Contracts_Storage_AgentDefinitionStoreContract_RollbackAsync_for_a_deleted_agent_throws_and_keeps_the_numbering"></a> RollbackAsync\_for\_a\_deleted\_agent\_throws\_and\_keeps\_the\_numbering\(\)

```csharp
[Fact]
public Task RollbackAsync_for_a_deleted_agent_throws_and_keeps_the_numbering()
```

#### Returns

 [Task](https://learn.microsoft.com/dotnet/api/system.threading.tasks.task)

### <a id="Tracon_Testing_Contracts_Storage_AgentDefinitionStoreContract_RollbackAsync_for_a_missing_agent_throws"></a> RollbackAsync\_for\_a\_missing\_agent\_throws\(\)

```csharp
[Fact]
public Task RollbackAsync_for_a_missing_agent_throws()
```

#### Returns

 [Task](https://learn.microsoft.com/dotnet/api/system.threading.tasks.task)

### <a id="Tracon_Testing_Contracts_Storage_AgentDefinitionStoreContract_RollbackAsync_saves_the_old_version_as_a_new_version"></a> RollbackAsync\_saves\_the\_old\_version\_as\_a\_new\_version\(\)

```csharp
[Fact]
public Task RollbackAsync_saves_the_old_version_as_a_new_version()
```

#### Returns

 [Task](https://learn.microsoft.com/dotnet/api/system.threading.tasks.task)

### <a id="Tracon_Testing_Contracts_Storage_AgentDefinitionStoreContract_RollbackAsync_to_a_missing_version_throws"></a> RollbackAsync\_to\_a\_missing\_version\_throws\(\)

```csharp
[Fact]
public Task RollbackAsync_to_a_missing_version_throws()
```

#### Returns

 [Task](https://learn.microsoft.com/dotnet/api/system.threading.tasks.task)

### <a id="Tracon_Testing_Contracts_Storage_AgentDefinitionStoreContract_SaveAsync_after_DeleteAsync_continues_the_numbering"></a> SaveAsync\_after\_DeleteAsync\_continues\_the\_numbering\(\)

```csharp
[Fact]
public Task SaveAsync_after_DeleteAsync_continues_the_numbering()
```

#### Returns

 [Task](https://learn.microsoft.com/dotnet/api/system.threading.tasks.task)

### <a id="Tracon_Testing_Contracts_Storage_AgentDefinitionStoreContract_SaveAsync_increments_version_and_keeps_history"></a> SaveAsync\_increments\_version\_and\_keeps\_history\(\)

```csharp
[Fact]
public Task SaveAsync_increments_version_and_keeps_history()
```

#### Returns

 [Task](https://learn.microsoft.com/dotnet/api/system.threading.tasks.task)

### <a id="Tracon_Testing_Contracts_Storage_AgentDefinitionStoreContract_SaveAsync_marks_origin_as_database"></a> SaveAsync\_marks\_origin\_as\_database\(\)

```csharp
[Fact]
public Task SaveAsync_marks_origin_as_database()
```

#### Returns

 [Task](https://learn.microsoft.com/dotnet/api/system.threading.tasks.task)

### <a id="Tracon_Testing_Contracts_Storage_AgentDefinitionStoreContract_SaveAsync_round_trips_all_definition_fields"></a> SaveAsync\_round\_trips\_all\_definition\_fields\(\)

```csharp
[Fact]
public Task SaveAsync_round_trips_all_definition_fields()
```

#### Returns

 [Task](https://learn.microsoft.com/dotnet/api/system.threading.tasks.task)

### <a id="Tracon_Testing_Contracts_Storage_AgentDefinitionStoreContract_SeedAsync_System_String_System_String_System_Threading_CancellationToken_"></a> SeedAsync\(string, string, CancellationToken\)

Writes a sample record for the given tenant.

```csharp
protected override ValueTask<object> SeedAsync(string tenantId, string name, CancellationToken cancellationToken)
```

#### Parameters

`tenantId` [string](https://learn.microsoft.com/dotnet/api/system.string)

The tenant that owns the record.

`name` [string](https://learn.microsoft.com/dotnet/api/system.string)

The name distinguishing the record. The same name may be used by two tenants.

`cancellationToken` [CancellationToken](https://learn.microsoft.com/dotnet/api/system.threading.cancellationtoken)

The token every store call inside the hook must be handed. The
cancellation contract calls this hook with a token that is already
cancelled, so a hook that drops the token reports a store as sound
when it is not.

#### Returns

 [ValueTask](https://learn.microsoft.com/dotnet/api/system.threading.tasks.valuetask\-1)<[object](https://learn.microsoft.com/dotnet/api/system.object)\>

The key to use for reading the record back.

#### Remarks

The tenant is not a parameter on the interface; it is read from
[ITenantContext](/api/tracon.itenantcontext/). Each hook therefore sets the active
tenant first.

### <a id="Tracon_Testing_Contracts_Storage_AgentDefinitionStoreContract_Tenant_cannot_roll_back_another_tenants_definition"></a> Tenant\_cannot\_roll\_back\_another\_tenants\_definition\(\)

```csharp
[Fact]
public Task Tenant_cannot_roll_back_another_tenants_definition()
```

#### Returns

 [Task](https://learn.microsoft.com/dotnet/api/system.threading.tasks.task)

### <a id="Tracon_Testing_Contracts_Storage_AgentDefinitionStoreContract_The_numbering_survives_every_delete_not_only_the_first"></a> The\_numbering\_survives\_every\_delete\_not\_only\_the\_first\(\)

```csharp
[Fact]
public Task The_numbering_survives_every_delete_not_only_the_first()
```

#### Returns

 [Task](https://learn.microsoft.com/dotnet/api/system.threading.tasks.task)

### <a id="Tracon_Testing_Contracts_Storage_AgentDefinitionStoreContract_TryDeleteAsync_System_String_System_Object_"></a> TryDeleteAsync\(string, object\)

Attempts to delete the record on behalf of the given tenant.

```csharp
protected override ValueTask<bool?> TryDeleteAsync(string tenantId, object key)
```

#### Parameters

`tenantId` [string](https://learn.microsoft.com/dotnet/api/system.string)

The tenant attempting the delete.

`key` [object](https://learn.microsoft.com/dotnet/api/system.object)

The key returned by [TenantIsolationContract.SeedAsync](/api/tracon.testing.contracts.storage/).

#### Returns

 [ValueTask](https://learn.microsoft.com/dotnet/api/system.threading.tasks.valuetask\-1)<[bool](https://learn.microsoft.com/dotnet/api/system.boolean)?\>

[true](https://learn.microsoft.com/dotnet/csharp/language-reference/builtin-types/bool) if the delete succeeded, [false](https://learn.microsoft.com/dotnet/csharp/language-reference/builtin-types/bool)
if the record was not found; [null](https://learn.microsoft.com/dotnet/csharp/language-reference/keywords/null) if the store does
not offer deletion.
