예제 #1
0
        protected override void OnModelCreating(ModelBuilder builder)
        {
            // Needed for Identity models configuration
            base.OnModelCreating(builder);

            this.ConfigureUserIdentityRelations(builder);

            EntityIndexesConfiguration.Configure(builder);

            var entityTypes = builder.Model.GetEntityTypes().ToList();

            // Set global query filter for not deleted entities only
            var deletableEntityTypes = entityTypes
                                       .Where(et => et.ClrType != null && typeof(IDeletableEntity).IsAssignableFrom(et.ClrType));

            foreach (var deletableEntityType in deletableEntityTypes)
            {
                var method = SetIsDeletedQueryFilterMethod.MakeGenericMethod(deletableEntityType.ClrType);
                method.Invoke(null, new object[] { builder });
            }

            // Disable cascade delete
            var foreignKeys = entityTypes
                              .SelectMany(e => e.GetForeignKeys().Where(f => f.DeleteBehavior == DeleteBehavior.Cascade));

            foreach (var foreignKey in foreignKeys)
            {
                foreignKey.DeleteBehavior = DeleteBehavior.Restrict;
            }
        }
예제 #2
0
        /// <summary>
        /// On model creating.
        /// </summary>
        /// <param name="builder">builder.</param>
        protected override void OnModelCreating(ModelBuilder builder)
        {
            // Needed for Identity models configuration
            base.OnModelCreating(builder);

            ConfigureUserIdentityRelations(builder);

            EntityIndexesConfiguration.Configure(builder);

            var entityTypes = builder.Model.GetEntityTypes().ToList();

            // Set global query filter for not deleted entities only
            var deletableEntityTypes = entityTypes
                                       .Where(et => et.ClrType != null && typeof(IDeletableEntity).IsAssignableFrom(et.ClrType));

            foreach (var deletableEntityType in deletableEntityTypes)
            {
                var method = SetIsDeletedQueryFilterMethod.MakeGenericMethod(deletableEntityType.ClrType);
                method.Invoke(null, new object[] { builder });
            }

            // Disable cascade delete
            var foreignKeys = entityTypes
                              .SelectMany(e => e.GetForeignKeys().Where(f => f.DeleteBehavior == DeleteBehavior.Cascade));

            foreach (var foreignKey in foreignKeys)
            {
                foreignKey.DeleteBehavior = DeleteBehavior.Restrict;
            }

            builder.Entity <Comment>()
            .HasOne(p => p.Post)
            .WithMany(t => t.Comments)
            .OnDelete(DeleteBehavior.Cascade);

            builder.Entity <Profile>()
            .HasOne(p => p.User)
            .WithOne(t => t.Profile)
            .OnDelete(DeleteBehavior.Cascade);

            builder.Entity <ApplicationUser>()
            .HasMany(p => p.Posts)
            .WithOne(t => t.Author)
            .HasForeignKey(x => x.AuthorId);

            builder.Entity <ApplicationUser>()
            .HasMany(p => p.SentMessages)
            .WithOne(t => t.Sender)
            .HasForeignKey(x => x.SenderId);

            builder.Entity <ApplicationUser>()
            .HasMany(p => p.ReceivedMessages)
            .WithOne(t => t.Recipient)
            .HasForeignKey(x => x.RecipientId);

            builder.Entity <Post>()
            .HasOne(bc => bc.Category)
            .WithMany(b => b.Posts)
            .HasForeignKey(bc => bc.CategoryId)
            .OnDelete(DeleteBehavior.Cascade);
            builder.Entity <PostsTagsRelations>()
            .HasKey(x => new { x.PostId, x.TagId });
            builder.Entity <PostsTagsRelations>()
            .HasOne(bc => bc.Tag)
            .WithMany(b => b.PostsTagsRelations)
            .HasForeignKey(bc => bc.TagId)
            .OnDelete(DeleteBehavior.Cascade);
            builder.Entity <PostsTagsRelations>()
            .HasOne(bc => bc.Post)
            .WithMany(c => c.PostsTagsRelations)
            .HasForeignKey(bc => bc.PostId)
            .OnDelete(DeleteBehavior.Cascade);
        }