/// <summary> /// This API supports the Entity Framework Core infrastructure and is not intended to be used /// directly from your code. This API may change or be removed in future releases. /// </summary> protected virtual void EnsureClrInheritance([NotNull] IModel model, [NotNull] IEntityType entityType, [NotNull] HashSet <IEntityType> validEntityTypes) { if (validEntityTypes.Contains(entityType)) { return; } var baseClrType = entityType.ClrType?.GetTypeInfo().BaseType; while (baseClrType != null) { var baseEntityType = model.FindEntityType(baseClrType); if (baseEntityType != null) { if (!baseEntityType.IsAssignableFrom(entityType)) { ShowError(CoreStrings.InconsistentInheritance(entityType.DisplayName(), baseEntityType.DisplayName())); } EnsureClrInheritance(model, baseEntityType, validEntityTypes); break; } baseClrType = baseClrType.GetTypeInfo().BaseType; } if (entityType.ClrType?.IsInstantiable() == false && !entityType.GetDerivedTypes().Any()) { ShowError(CoreStrings.AbstractLeafEntityType(entityType.DisplayName())); } validEntityTypes.Add(entityType); }
public virtual void Detects_generic_leaf_type() { var model = new Model(); var entityAbstract = model.AddEntityType(typeof(Abstract)); SetPrimaryKey(entityAbstract); var entityGeneric = model.AddEntityType(typeof(Generic <>)); entityGeneric.HasBaseType(entityAbstract); VerifyError(CoreStrings.AbstractLeafEntityType(entityGeneric.DisplayName()), model); }
public virtual void Detects_abstract_leaf_type() { var model = new Model(); var entityA = model.AddEntityType(typeof(A)); SetPrimaryKey(entityA); var entityAbstract = model.AddEntityType(typeof(Abstract)); SetBaseType(entityAbstract, entityA); VerifyError(CoreStrings.AbstractLeafEntityType(entityAbstract.DisplayName()), model); }
public virtual void Detects_generic_leaf_type() { var model = CreateConventionlessModelBuilder().Model; var entityAbstract = model.AddEntityType(typeof(Abstract)); SetPrimaryKey(entityAbstract); var entityGeneric = model.AddEntityType(typeof(Generic <>)); SetBaseType(entityGeneric, entityAbstract); VerifyError(CoreStrings.AbstractLeafEntityType(entityGeneric.DisplayName()), model); }
public virtual void Detects_abstract_leaf_type() { var model = CreateConventionlessModelBuilder().Model; var entityA = model.AddEntityType(typeof(A)); SetPrimaryKey(entityA); AddProperties(entityA); var entityAbstract = model.AddEntityType(typeof(Abstract)); SetBaseType(entityAbstract, entityA); VerifyError(CoreStrings.AbstractLeafEntityType(entityAbstract.DisplayName()), model); }
private void ValidateClrInheritance( IModel model, IEntityType entityType, HashSet <IEntityType> validEntityTypes) { if (validEntityTypes.Contains(entityType)) { return; } if (entityType.HasSharedClrType && entityType.BaseType != null) { throw new InvalidOperationException(CoreStrings.SharedTypeDerivedType(entityType.DisplayName())); } if (entityType.FindDeclaredOwnership() == null && entityType.BaseType != null) { var baseClrType = entityType.ClrType.BaseType; while (baseClrType != null) { var baseEntityType = model.FindEntityType(baseClrType); if (baseEntityType != null) { if (!baseEntityType.IsAssignableFrom(entityType)) { throw new InvalidOperationException( CoreStrings.InconsistentInheritance( entityType.DisplayName(), entityType.BaseType.DisplayName(), baseEntityType.DisplayName())); } break; } baseClrType = baseClrType.BaseType; } } if (!entityType.ClrType.IsInstantiable() && !entityType.GetDerivedTypes().Any()) { throw new InvalidOperationException( CoreStrings.AbstractLeafEntityType(entityType.DisplayName())); } validEntityTypes.Add(entityType); }
private void ValidateClrInheritance( [NotNull] IModel model, [NotNull] IEntityType entityType, [NotNull] HashSet <IEntityType> validEntityTypes, DiagnosticsLoggers loggers) { Check.NotNull(model, nameof(model)); Check.NotNull(entityType, nameof(entityType)); Check.NotNull(validEntityTypes, nameof(validEntityTypes)); if (validEntityTypes.Contains(entityType)) { return; } if (!entityType.HasDefiningNavigation() && entityType.FindDeclaredOwnership() == null && entityType.BaseType != null) { var baseClrType = entityType.ClrType?.GetTypeInfo().BaseType; while (baseClrType != null) { var baseEntityType = model.FindEntityType(baseClrType); if (baseEntityType != null) { if (!baseEntityType.IsAssignableFrom(entityType)) { throw new InvalidOperationException( CoreStrings.InconsistentInheritance(entityType.DisplayName(), baseEntityType.DisplayName())); } break; } baseClrType = baseClrType.GetTypeInfo().BaseType; } } if (entityType.ClrType?.IsInstantiable() == false && !entityType.GetDerivedTypes().Any()) { throw new InvalidOperationException( CoreStrings.AbstractLeafEntityType(entityType.DisplayName())); } validEntityTypes.Add(entityType); }
/// <summary> /// This API supports the Entity Framework Core infrastructure and is not intended to be used /// directly from your code. This API may change or be removed in future releases. /// </summary> protected virtual void ValidateClrInheritance( [NotNull] IModel model, [NotNull] IEntityType entityType, [NotNull] HashSet <IEntityType> validEntityTypes) { Check.NotNull(model, nameof(model)); Check.NotNull(entityType, nameof(entityType)); Check.NotNull(validEntityTypes, nameof(validEntityTypes)); if (validEntityTypes.Contains(entityType)) { return; } var baseClrType = entityType.ClrType?.GetTypeInfo().BaseType; while (baseClrType != null) { var baseEntityType = model.FindEntityType(baseClrType); if (baseEntityType != null) { if (!baseEntityType.IsAssignableFrom(entityType)) { throw new InvalidOperationException( CoreStrings.InconsistentInheritance(entityType.DisplayName(), baseEntityType.DisplayName())); } ValidateClrInheritance(model, baseEntityType, validEntityTypes); break; } baseClrType = baseClrType.GetTypeInfo().BaseType; } if (entityType.ClrType?.IsInstantiable() == false && !entityType.GetDerivedTypes().Any()) { throw new InvalidOperationException( CoreStrings.AbstractLeafEntityType(entityType.DisplayName())); } validEntityTypes.Add(entityType); }