/// <inheritdoc /> protected override void ProcessEntityTypeAdded( IConventionEntityTypeBuilder entityTypeBuilder, BsonKnownTypesAttribute attribute, IConventionContext <IConventionEntityTypeBuilder> context) { MongoEntityTypeAnnotations annotations = entityTypeBuilder.MongoDb(); if (!annotations.DiscriminatorIsRequired) { annotations.DiscriminatorIsRequired = entityTypeBuilder.Metadata.IsAbstract(); } if (attribute.KnownTypes != null) { IConventionModelBuilder modelBuilder = entityTypeBuilder.ModelBuilder; Type baseType = entityTypeBuilder.Metadata.ClrType; foreach (Type derivedType in attribute.KnownTypes) { if (!baseType.IsAssignableFrom(derivedType)) { throw new InvalidOperationException($"Known type {derivedType} declared on base type {baseType} does not inherit from base type."); } modelBuilder .Entity(derivedType, fromDataAnnotation: true) .MongoDb() .IsDerivedType = true; } } }
private void ValidateDiscriminator(IEntityType entityType, ISet <Tuple <IEntityType, string> > discriminatorSet) { var annotations = new MongoEntityTypeAnnotations(entityType); if (string.IsNullOrWhiteSpace(annotations.Discriminator)) { throw new InvalidOperationException($"Missing discriminator value for entity type {entityType.DisplayName()}."); } if (!discriminatorSet.Add(Tuple.Create(entityType.GetRootType(), annotations.Discriminator))) { throw new InvalidOperationException($"Duplicate discriminator value {annotations.Discriminator} for root entity type {entityType.GetRootType().DisplayName()} (defined on {entityType.DisplayName()})."); } }
/// <inheritdoc /> protected override void ProcessEntityTypeAdded( IConventionEntityTypeBuilder entityTypeBuilder, BsonDiscriminatorAttribute attribute, IConventionContext <IConventionEntityTypeBuilder> context) { Check.NotNull(entityTypeBuilder, nameof(entityTypeBuilder)); Check.NotNull(attribute, nameof(attribute)); MongoEntityTypeAnnotations annotations = entityTypeBuilder.MongoDb(); if (!string.IsNullOrWhiteSpace(attribute.Discriminator)) { annotations.Discriminator = attribute.Discriminator; } if (!annotations.DiscriminatorIsRequired) { annotations.DiscriminatorIsRequired = attribute.Required; } annotations.IsRootType = attribute.RootClass; }