Skip to main content

PROJ006: Conflicting UseProjection attributes

FieldValue
CodePROJ006
SeverityError

Message

GSI '{0}' has multiple conflicting UseProjection attributes specifying different projection types

Description

A GSI can only have one projection type constraint across all entities. When multiple entities in a multi-entity table define the same GSI, they must agree on the projection type used for that index.

This diagnostic is emitted when two or more [UseProjection] attributes on the same GSI reference different projection types. Resolve the conflict by ensuring all entities sharing the index use the same projection type, or remove the conflicting attributes.

Example

The following code triggers this diagnostic:

[DynamoDbTable("shared-table", IsDefault = true)]
public partial class Order
{
[PartitionKey]
[DynamoDbAttribute("pk")]
public string Pk { get; set; } = string.Empty;

[GsiPartitionKey("gsi1")]
[UseProjection(typeof(OrderSummary))]
[DynamoDbAttribute("gsi1pk")]
public string Gsi1Pk { get; set; } = string.Empty;
}

[DynamoDbTable("shared-table")]
public partial class Customer
{
[PartitionKey]
[DynamoDbAttribute("pk")]
public string Pk { get; set; } = string.Empty;

// PROJ006: gsi1 already uses OrderSummary
[GsiPartitionKey("gsi1")]
[UseProjection(typeof(CustomerSummary))]
[DynamoDbAttribute("gsi1pk")]
public string Gsi1Pk { get; set; } = string.Empty;
}

Fix

The corrected version:

[DynamoDbTable("shared-table", IsDefault = true)]
public partial class Order
{
[PartitionKey]
[DynamoDbAttribute("pk")]
public string Pk { get; set; } = string.Empty;

[GsiPartitionKey("gsi1")]
[UseProjection(typeof(SharedSummary))]
[DynamoDbAttribute("gsi1pk")]
public string Gsi1Pk { get; set; } = string.Empty;
}

[DynamoDbTable("shared-table")]
public partial class Customer
{
[PartitionKey]
[DynamoDbAttribute("pk")]
public string Pk { get; set; } = string.Empty;

[GsiPartitionKey("gsi1")]
[UseProjection(typeof(SharedSummary))]
[DynamoDbAttribute("gsi1pk")]
public string Gsi1Pk { get; set; } = string.Empty;
}