public void Configure_should_configure_active_entities_and_complex_types() { var mockEntityType = new MockType(); var mockComplexType = new MockType(); var model = new EdmModel().Initialize(); var entityType = model.AddEntityType("E"); entityType.SetClrType(mockEntityType); var complexType = model.AddComplexType("C"); complexType.SetClrType(mockComplexType); var modelConfiguration = new ModelConfiguration(); var mockComplexTypeConfiguration = new Mock<ComplexTypeConfiguration>(mockComplexType.Object); var mockEntityTypeConfiguration = new Mock<EntityTypeConfiguration>(mockEntityType.Object); modelConfiguration.Add(mockComplexTypeConfiguration.Object); modelConfiguration.Add(mockEntityTypeConfiguration.Object); modelConfiguration.Configure(model); mockComplexTypeConfiguration.Verify(c => c.Configure(complexType)); mockEntityTypeConfiguration.Verify(c => c.Configure(entityType, model)); }
public void GetComplexType_should_return_correct_type() { var model = new EdmModel().Initialize(); var complexType = model.AddComplexType("Foo"); var foundComplexType = model.GetComplexType("Foo"); Assert.NotNull(foundComplexType); Assert.Same(complexType, foundComplexType); }
public void GetStructuralType_should_return_entity_or_complex_type() { var model = new EdmModel().Initialize(); var entityType = model.AddEntityType("E"); var complexType = model.AddComplexType("C"); Assert.Same(entityType, model.GetStructuralType("E")); Assert.Same(complexType, model.GetStructuralType("C")); }
public void AddComplexType_should_create_and_add_to_default_namespace() { var model = new EdmModel().Initialize(); var complexType = model.AddComplexType("Foo"); Assert.NotNull(complexType); Assert.Equal("Foo", complexType.Name); Assert.True(model.Namespaces.Single().ComplexTypes.Contains(complexType)); }
void IEdmConvention.Apply(EdmModel model) { // Query the model for candidate complex types. // - The rules for complex type discovery are as follows: // 1) The entity does not have a key or base type. // 2) The entity does not have explicit configuration or has only structural type configuration. // 3) The entity does not have any outbound navigation properties. // The entity only has inbound associations where: // 4) The association does not have a constraint defined. // 5) The association does not have explicit configuration. // 6) The association is not self-referencing. // 7) The other end of the association is Optional. // 8) Any inbound navigation properties do not have explicit configuration. var candidates = from entityType in model.GetEntityTypes() where entityType.DeclaredKeyProperties.Count == 0 // (1) && entityType.BaseType == null // (1) let entityTypeConfiguration = entityType.GetConfiguration() as EntityTypeConfiguration where ((entityTypeConfiguration == null) // (2) || (!entityTypeConfiguration.IsExplicitEntity && entityTypeConfiguration.IsStructuralConfigurationOnly)) // (2) && !entityType.NavigationProperties.Any() // (3) let matchingAssociations = from associationType in model.GetAssociationTypes() where associationType.SourceEnd.EntityType == entityType || associationType.TargetEnd.EntityType == entityType let declaringEnd = associationType.SourceEnd.EntityType == entityType ? associationType.SourceEnd : associationType.TargetEnd let declaringEntity = associationType.GetOtherEnd(declaringEnd).EntityType let navigationProperties = declaringEntity.NavigationProperties .Where(n => n.ResultEnd.EntityType == entityType) select new { DeclaringEnd = declaringEnd, AssociationType = associationType, DeclaringEntityType = declaringEntity, NavigationProperties = navigationProperties.ToList() } where matchingAssociations.All( a => a.AssociationType.Constraint == null // (4) && a.AssociationType.GetConfiguration() == null // (5) && !a.AssociationType.IsSelfReferencing() // (6) && a.DeclaringEnd.IsOptional() // (7) && a.NavigationProperties.All(n => n.GetConfiguration() == null)) // (8) select new { EntityType = entityType, MatchingAssociations = matchingAssociations.ToList(), }; // Transform candidate entities into complex types foreach (var candidate in candidates.ToList()) { var complexType = model.AddComplexType(candidate.EntityType.Name); foreach (var property in candidate.EntityType.DeclaredProperties) { complexType.DeclaredProperties.Add(property); } foreach (var annotation in candidate.EntityType.Annotations) { complexType.Annotations.Add(annotation); } foreach (var association in candidate.MatchingAssociations) { foreach (var navigationProperty in association.NavigationProperties) { if (association.DeclaringEntityType.NavigationProperties.Contains(navigationProperty)) { association.DeclaringEntityType.DeclaredNavigationProperties.Remove(navigationProperty); var complexProperty = association.DeclaringEntityType.AddComplexProperty(navigationProperty.Name, complexType); foreach (var annotation in navigationProperty.Annotations) { complexProperty.Annotations.Add(annotation); } } } model.RemoveAssociationType(association.AssociationType); } model.RemoveEntityType(candidate.EntityType); } }