dotnet/efcore · error · InvalidOperationException
The entity type '{entityType}' is sharing the container '{co
Error message
The entity type '{entityType}' is sharing the container '{container}' with other types, but does not have a discriminator property configured. Configure a discriminator property and assign a unique value for this entity type. What it means
When two or more entity types share a Cosmos container, each must carry a discriminator property so Cosmos can distinguish document kinds. CosmosModelValidator throws InvalidOperationException via CosmosStrings.NoDiscriminatorProperty when an instantiable, container-root entity type sharing a container has no discriminator property configured.
Source
Thrown at src/EFCore.Cosmos/Infrastructure/Internal/CosmosModelValidator.cs:201
partitionKeyStoreNames[i],
entityType.GetPartitionKeyPropertyNames()[i],
entityType.DisplayName(),
storeNames[i]));
}
}
}
if (mappedTypes.Count == 1)
{
break;
}
if (entityType.ClrType.IsInstantiable()
&& entityType.GetContainingPropertyName() == null)
{
if (entityType.FindDiscriminatorProperty() == null)
{
throw new InvalidOperationException(CosmosStrings.NoDiscriminatorProperty(entityType.DisplayName(), container));
}
var discriminatorValue = entityType.GetDiscriminatorValue();
if (discriminatorValue == null)
{
throw new InvalidOperationException(CosmosStrings.NoDiscriminatorValue(entityType.DisplayName(), container));
}
if (discriminatorValues.TryGetValue(discriminatorValue, out var duplicateEntityType))
{
throw new InvalidOperationException(
CosmosStrings.DuplicateDiscriminatorValue(
entityType.DisplayName(),
discriminatorValue,
duplicateEntityType.DisplayName(),
container));
}
View on GitHub (pinned to dbf9771522)
Solutions
- Configure a discriminator property on each entity type sharing the container (modelBuilder.Entity<T>().HasDiscriminator(x => x.Kind)).
- Ensure each concrete type also gets a unique discriminator value.
- Re-enable the discriminator convention if it was removed.
Example fix
// before (two roots, one container, no discriminator)
modelBuilder.Entity<Cat>().ToContainer("pets");
modelBuilder.Entity<Dog>().ToContainer("pets");
// after (discriminator configured)
modelBuilder.Entity<Cat>(b => { b.ToContainer("pets"); b.HasDiscriminator(c => c.Kind).HasValue("cat"); });
modelBuilder.Entity<Dog>(b => { b.ToContainer("pets"); b.HasDiscriminator(d => d.Kind).HasValue("dog"); }); Defensive patterns
Strategy: validation
Validate before calling
// Every root type in a shared container needs a discriminator property.
var byContainer = modelBuilder.Model.GetEntityTypes()
.Where(e => e.FindPrimaryKey() != null && e.GetContainer() != null && e.ClrType.IsInstantiable())
.GroupBy(e => e.GetContainer());
foreach (var g in byContainer.Where(g => g.Count() > 1))
foreach (var et in g.Where(e => e.FindDiscriminatorProperty() == null))
throw new InvalidOperationException($"{et.Name} in container {g.Key} needs a discriminator property."); Try / catch
try { context.Database.EnsureCreated(); }
catch (InvalidOperationException ex) when (ex.Message.Contains("discriminator property"))
{ throw new InvalidOperationException("Configure HasDiscriminator on each type in the shared container.", ex); } Prevention
- Whenever you share a container across 2+ roots, configure HasDiscriminator on all of them.
- Keep the default discriminator convention enabled.
- Add a build-time test asserting discriminator presence for shared containers.
When it happens
Trigger: Mapping 2+ entity types to the same container without calling HasDiscriminator on any of them; relying on default discriminator behavior that did not apply (e.g. disabled).
Common situations: Consolidating previously separate containers into one shared container without adding discriminators; adding a new root type to an existing shared container; disabling the default discriminator convention.
Related errors
- The entity type '{entityType}' is sharing the container '{co
- The discriminator value for '{entityType1}' is '{discriminat
- The IsDiscriminatorMappingComplete setting was configured to
- An Azure Cosmos DB container name is defined on entity type
- The partition key properties for entity type '{entityType1}'
AI-assisted analysis of dotnet/efcore@dbf9771522 (2026-08-06).
Data as JSON: /api/errors/c7a7bb2341b4ae4d.
Report an issue: GitHub.