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

  1. Configure a discriminator property on each entity type sharing the container (modelBuilder.Entity<T>().HasDiscriminator(x => x.Kind)).
  2. Ensure each concrete type also gets a unique discriminator value.
  3. 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

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


AI-assisted analysis of dotnet/efcore@dbf9771522 (2026-08-06). Data as JSON: /api/errors/c7a7bb2341b4ae4d. Report an issue: GitHub.