public void EdmMemberShouldBeEscaped() { // TODO: consider creating a collection of default types suitable for testing, // so this massive setup is not always required. var entityTypeBuilder = new EntityTypeBuilder(); var tags = entityTypeBuilder .Name("My.Tags") .WithProperty <int>("ID") .WithProperty <int>("Post_ID") .WithKeys("ID") .Build(); var posts = entityTypeBuilder .Name("My.Posts") .WithProperty <int>("ID") .WithKeys("ID") .Build(); var builder = new NavigationPropertyBuilder(); var navigationProperty = builder .FromRole(posts, RelationshipMultiplicity.Many) .ToRole(tags, RelationshipMultiplicity.One) .Map("ID", "Post_ID") .Build(); this.escaper.Escape(navigationProperty).Should().Be("Tags"); }
public ManyToOneNavigationBuilder(ManyNavigationBuilder manyNavigationBuilder, string propertyName = null) : base(manyNavigationBuilder, propertyName) { _manyNavigationBuilder = manyNavigationBuilder; if (propertyName != null) { _navigationPropertyBuilder = _manyNavigationBuilder.EntityBuilder.ModelBuilder.Entity(_manyNavigationBuilder.TargetType).Navigation(propertyName); _navigationPropertyBuilder.TargetMultiplicity = NavigationPropertyMultiplicity.Many; _navigationPropertyBuilder.Multiplicity = NavigationPropertyMultiplicity.One; } }
public MappingRelationshipForeignKeyMatcherTest() { this.builder = new NavigationPropertyBuilder(); this.entityTypeBuilder = new EntityTypeBuilder(); this.tags = this.entityTypeBuilder .Name("My.Tags") .WithProperty <int>("ID") .WithProperty <int>("Post_ID") .WithKeys("ID") .Build(); this.posts = this.entityTypeBuilder .Name("My.Posts") .WithProperty <int>("ID") .WithKeys("ID") .Build(); }
public void ManyToManyNavigationShouldBeCorrect() { var entityTypeBuilder = new EntityTypeBuilder(); var posts = entityTypeBuilder .Name("My.Posts") .WithProperty <int>("ID") .WithKeys("ID") .Build(); var tags = entityTypeBuilder .Name("My.Tags") .WithProperty <int>("ID") .WithKeys("ID") .Build(); var builder = new NavigationPropertyBuilder(); var postsToTags = builder .FromRole(posts, RelationshipMultiplicity.Many) .ToRole(tags, RelationshipMultiplicity.Many) .Map("ID", "Post_ID") .Build(); var tagsToPosts = builder .FromRole(tags, RelationshipMultiplicity.Many) .ToRole(posts, RelationshipMultiplicity.Many) .Map("ID", "Tag_ID") .WithSameRelationshipAs(postsToTags) .Build(); posts.AddNavigationProperty(postsToTags); tags.AddNavigationProperty(tagsToPosts); var testSubject = new ManyToManyNavigation(tagsToPosts); testSubject.HasMany.Name.Should().Be("Posts"); testSubject.HasManyEntity.Should().BeSameAs(tags); testSubject.HasManyEndMember.Name.Should().Be("Tags"); testSubject.WithMany.Name.Should().Be("Tags"); testSubject.WithManyEntity.Should().BeSameAs(posts); testSubject.WithManyEndMember.Name.Should().Be("Posts"); }
internal NavigationPropertyMetadata(ModelCreationScope scope, EntityMetadata entity, NavigationPropertyBuilder builder) : base(entity, builder) { scope.AddNavigationProperty(entity, builder.Name, this); this.Multiplicity = builder.Multiplicity; this.TargetMultiplicity = builder.TargetMultiplicity; this.TargetEntity = scope.GetEntity(builder.Target.ClrType); if (builder.TargetProperty != null) { this.TargetNavigationPropertyName = builder.TargetProperty; ////this.TargetNavigationProperty = scope.NavigationProperties[this.TargetEntity][builder.TargetProperty]; } var foreignKeyBuilder = ImmutableList.CreateBuilder <ForeignKey>(); var principalKeys = this.TargetEntity.GetProperties().Where(p => p.IsPrimaryKey).ToList(); for (int i = 0; i < builder.ForeignKey.Count; i++) { var fk = builder.ForeignKey[i]; foreignKeyBuilder.Add(new ForeignKey(principalKeys[i], entity.GetProperties().First(p => p.Name == fk))); } ForeignKeyProperties = foreignKeyBuilder.ToImmutable(); }
private static EntityMetadataBuilder FromEntityType(this MetadataModelBuilder builder, MetadataWorkspace metadata, EntityType entityType) { var objectItemCollection = (ObjectItemCollection)metadata.GetItemCollection(DataSpace.OSpace); var mapping = metadata.GetItems <EntityContainerMapping>(DataSpace.CSSpace) .Single() .EntitySetMappings .SelectMany(p => p.EntityTypeMappings); var objectTypes = metadata.GetItems <EntityType>(DataSpace.OSpace); var objectType = objectTypes.Single(p => p.Name == entityType.Name); var clrType = objectItemCollection.GetClrType(objectType); var entityBuilder = builder.Entity(clrType); if (entityType.BaseType != null) { var baseEntityBuilder = builder.FromEntityType(metadata, (EntityType)entityType.BaseType); entityBuilder.BaseEntity = baseEntityBuilder; } var propertyMappings = mapping.SelectMany(p => p.Fragments.SelectMany(x => x.PropertyMappings)).OfType <ScalarPropertyMapping>().ToList(); var joined = from p in entityType.Properties.Where(p => p.DeclaringType == entityType) join m in propertyMappings on p equals m.Property select new { Property = p, Column = m.Column }; foreach (var prop in joined) { var propertyClrType = metadata.GetClrTypeFromCSpaceType(prop.Property); var propBuilder = entityBuilder.Property(prop.Property.Name, propertyClrType); propBuilder.Nullable = prop.Property.Nullable; if (prop.Column.IsStoreGeneratedComputed) { propBuilder.ValueGeneration = AutoGenerateValue.Both; } else if (prop.Column.IsStoreGeneratedIdentity) { propBuilder.ValueGeneration = AutoGenerateValue.OnInsert; } propBuilder.HasDefaultValue = prop.Column.MetadataProperties.Any(p => p.IsAnnotation && p.Name.EndsWith(":" + DefaultValueAnnotation.AnnotationName, StringComparison.Ordinal)); if (propBuilder is TextPropertyBuilder textBuilder) { textBuilder.MaxLength = prop.Property.MaxLength; } else if (propBuilder is BlobPropertyBuilder blobPropertyBuilder) { blobPropertyBuilder.MaxLength = prop.Property.MaxLength; } } if (entityType.BaseType == null) { foreach (var pk in entityType.KeyProperties) { entityBuilder.PrimaryKey.Add(pk.Name); } } foreach (var nav in entityType.NavigationProperties.Where(p => p.DeclaringType == entityType)) { NavigationPropertyBuilder navBuilder = null; ////var navpropMatch = from l in item.EntityMetadata.Properties.OfType<NavigationPropertyMetadata>() //// join r in item.EntityType.NavigationProperties on l.Name equals r.Name //// select new { Left = l, Right = r }; ////foreach (var npmatch in navpropMatch) ////{ //// var test = entityTypes.SelectMany(p => p.NavigationProperties) //// .FirstOrDefault(p => p.ToEndMember == npmatch.Right.FromEndMember); var inverse = nav.ToEndMember.GetEntityType().NavigationProperties.FirstOrDefault(p => p.FromEndMember == nav.ToEndMember); ////var inverse = nav.ToEndMember.MetadataProperties.FirstOrDefault(p => p.Name == "ClrPropertyInfo")?.Value as PropertyInfo; var targetObjectType = objectTypes.Single(p => p.Name == nav.ToEndMember.GetEntityType().Name); var targetClrType = objectItemCollection.GetClrType(targetObjectType); string targetPropertyName = inverse?.Name; List <string> foreignKeys = new List <string>(); var multiplicity = GetMultiplicity(nav.ToEndMember.RelationshipMultiplicity); var targetMultiplicity = GetMultiplicity(nav.FromEndMember.RelationshipMultiplicity); if (multiplicity != NavigationPropertyMultiplicity.Many) { foreignKeys.AddRange(nav.GetDependentProperties().Select(p => p.Name)); } navBuilder = entityBuilder.Navigation(nav.Name); navBuilder.Nullable = multiplicity == NavigationPropertyMultiplicity.ZeroOrOne; navBuilder.Multiplicity = multiplicity; navBuilder.Target = new ClrTypeInfo(targetClrType); navBuilder.TargetProperty = targetPropertyName; navBuilder.TargetMultiplicity = targetMultiplicity; navBuilder.ForeignKey = foreignKeys; } return(entityBuilder); }
private static EntityMetadataBuilder FromEntityType(this MetadataModelBuilder builder, IEntityType entityType) { var entityBuilder = builder.Entity(entityType.ClrType); if (entityType.BaseType != null) { var baseEntityBuilder = builder.FromEntityType(entityType.BaseType); entityBuilder.BaseEntity = baseEntityBuilder; } var properties = entityType.GetProperties().Where(p => p.DeclaringEntityType == entityType); foreach (var prop in properties) { var propBuilder = entityBuilder.Property(prop.Name, prop.ClrType); propBuilder.Nullable = prop.IsNullable; if (prop.ValueGenerated == ValueGenerated.OnAdd) { propBuilder.ValueGeneration = AutoGenerateValue.OnInsert; } else if (prop.ValueGenerated == ValueGenerated.OnAddOrUpdate) { propBuilder.ValueGeneration = AutoGenerateValue.Both; } #if NETSTANDARD2_0 else if (prop.ValueGenerated == ValueGenerated.OnUpdate) { propBuilder.ValueGeneration = AutoGenerateValue.Both; } #endif if (propBuilder is TextPropertyBuilder textBuilder) { textBuilder.MaxLength = prop.GetMaxLength(); } else if (propBuilder is BlobPropertyBuilder blobPropertyBuilder) { blobPropertyBuilder.MaxLength = prop.GetMaxLength(); } } if (entityType.BaseType == null) { foreach (var pk in entityType.FindPrimaryKey().Properties) { entityBuilder.PrimaryKey.Add(pk.Name); } } foreach (var nav in entityType.GetNavigations().Where(p => p.DeclaringEntityType == entityType)) { NavigationPropertyBuilder navBuilder = null; var inverse = nav.FindInverse(); Type targetType = nav.GetTargetType().ClrType; string targetPropertyName = inverse?.Name; List <string> foreignKeys = new List <string>(); NavigationPropertyMultiplicity multiplicity = NavigationPropertyMultiplicity.One; NavigationPropertyMultiplicity targetMultiplicity = NavigationPropertyMultiplicity.One; if (nav.IsCollection()) { multiplicity = NavigationPropertyMultiplicity.Many; targetMultiplicity = nav.ForeignKey.IsRequired ? NavigationPropertyMultiplicity.One : NavigationPropertyMultiplicity.ZeroOrOne; } else if (nav.IsDependentToPrincipal()) { multiplicity = nav.ForeignKey.IsRequired ? NavigationPropertyMultiplicity.One : NavigationPropertyMultiplicity.ZeroOrOne; targetMultiplicity = nav.ForeignKey.IsUnique ? NavigationPropertyMultiplicity.ZeroOrOne : NavigationPropertyMultiplicity.Many; foreignKeys = nav.ForeignKey.Properties.Select(p => p.Name).ToList(); } else { multiplicity = NavigationPropertyMultiplicity.ZeroOrOne; targetMultiplicity = NavigationPropertyMultiplicity.One; } navBuilder = entityBuilder.Navigation(nav.Name); navBuilder.Nullable = multiplicity == NavigationPropertyMultiplicity.ZeroOrOne; navBuilder.Multiplicity = multiplicity; navBuilder.Target = new ClrTypeInfo(targetType); navBuilder.TargetProperty = targetPropertyName; navBuilder.TargetMultiplicity = targetMultiplicity; navBuilder.ForeignKey = foreignKeys; } return(entityBuilder); }