Exemplo n.º 1
0
        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;
     }
 }
Exemplo n.º 3
0
        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();
        }
Exemplo n.º 4
0
        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);
        }