diff --git a/src/entityframeworkcore/src/entityframeworkcore3.validation/Aranasoft.Cobweb.EntityFrameworkCore3.Validation.csproj b/src/entityframeworkcore/src/entityframeworkcore3.validation/Aranasoft.Cobweb.EntityFrameworkCore3.Validation.csproj index 5312d5a..aeaf16c 100644 --- a/src/entityframeworkcore/src/entityframeworkcore3.validation/Aranasoft.Cobweb.EntityFrameworkCore3.Validation.csproj +++ b/src/entityframeworkcore/src/entityframeworkcore3.validation/Aranasoft.Cobweb.EntityFrameworkCore3.Validation.csproj @@ -5,7 +5,7 @@ netstandard2.1 Aranasoft.Cobweb.EntityFrameworkCore.Validation Aranasoft.Cobweb.EntityFrameworkCore.Validation - 1.30.2 + 1.30.3 AnyCPU;x64 diff --git a/src/entityframeworkcore/src/entityframeworkcore3.validation/SchemaValidator.cs b/src/entityframeworkcore/src/entityframeworkcore3.validation/SchemaValidator.cs index a6b6ea9..90892a9 100644 --- a/src/entityframeworkcore/src/entityframeworkcore3.validation/SchemaValidator.cs +++ b/src/entityframeworkcore/src/entityframeworkcore3.validation/SchemaValidator.cs @@ -37,11 +37,11 @@ public class SchemaValidator { validationErrors.AddRange(ValidateColumns(databaseModel, persistedType, validationOptions)); - if (validationOptions.ValidateIndexes) { + if (validationOptions.ValidateIndexes && persistedType.FindAnnotation(RelationalAnnotationNames.ViewDefinition) == null) { validationErrors.AddRange(ValidateIndexes(databaseModel, persistedType)); } - if (validationOptions.ValidateForeignKeys) { + if (validationOptions.ValidateForeignKeys && persistedType.FindAnnotation(RelationalAnnotationNames.ViewDefinition) == null) { validationErrors.AddRange(ValidateForeignKeys(databaseModel, persistedType)); } } diff --git a/src/entityframeworkcore/test/entityframeworkcore2.validation.tests/Support/ApplicationDbContext.cs b/src/entityframeworkcore/test/entityframeworkcore2.validation.tests/Support/ApplicationDbContext.cs index 44dd935..4c51564 100644 --- a/src/entityframeworkcore/test/entityframeworkcore2.validation.tests/Support/ApplicationDbContext.cs +++ b/src/entityframeworkcore/test/entityframeworkcore2.validation.tests/Support/ApplicationDbContext.cs @@ -16,6 +16,7 @@ public ApplicationDbContext(DbContextOptions options) base.OnModelCreating(builder); builder.ApplyConfiguration(new ViewBasedEntityMapping()); + builder.ApplyConfiguration(new TableBasedEntityMapping()); } } } diff --git a/src/entityframeworkcore/test/entityframeworkcore2.validation.tests/Support/Migrations/MigrationsMissingForeignKeys.cs b/src/entityframeworkcore/test/entityframeworkcore2.validation.tests/Support/Migrations/MigrationsMissingForeignKeys.cs index 6497d6a..11f4053 100644 --- a/src/entityframeworkcore/test/entityframeworkcore2.validation.tests/Support/Migrations/MigrationsMissingForeignKeys.cs +++ b/src/entityframeworkcore/test/entityframeworkcore2.validation.tests/Support/Migrations/MigrationsMissingForeignKeys.cs @@ -97,7 +97,13 @@ public override void Up() .WithColumn("Value", col => col.AsStringMax().Nullable()) ; - Execute.Sql(@"CREATE VIEW ViewBasedEntities AS SELECT Id, Email FROM AspNetUsers"); + Create.Table("TableBasedEntity") + .WithColumn("Id", col => col.AsInt32().NotNullable().PrimaryKey("PK_TableBasedEntity")) + .WithColumn("Field", col => col.AsString(256).Nullable()) + .WithColumn("RoleId", col => col.AsInt32().NotNullable().Indexed("IX_TableBasedEntity_RoleId")) + ; + + Execute.Sql(@"CREATE VIEW ViewBasedEntities AS SELECT Id, Field, RoleId FROM TableBasedEntity"); } public override void Down() diff --git a/src/entityframeworkcore/test/entityframeworkcore2.validation.tests/Support/Migrations/MigrationsMissingIndexes.cs b/src/entityframeworkcore/test/entityframeworkcore2.validation.tests/Support/Migrations/MigrationsMissingIndexes.cs index 43880e7..659db7d 100644 --- a/src/entityframeworkcore/test/entityframeworkcore2.validation.tests/Support/Migrations/MigrationsMissingIndexes.cs +++ b/src/entityframeworkcore/test/entityframeworkcore2.validation.tests/Support/Migrations/MigrationsMissingIndexes.cs @@ -105,7 +105,15 @@ public override void Up() .WithColumn("Value", col => col.AsStringMax().Nullable()) ; - Execute.Sql(@"CREATE VIEW ViewBasedEntities AS SELECT Id, Email FROM AspNetUsers"); + Create.Table("TableBasedEntity") + .WithColumn("Id", col => col.AsInt32().NotNullable().PrimaryKey("PK_TableBasedEntity")) + .WithColumn("Field", col => col.AsString(256).Nullable()) + .WithColumn("RoleId", col => col.AsInt32().NotNullable() + .ForeignKey("FK_TableBasedEntity_AspNetRoles_RoleId", "AspNetRoles", "Id") + .OnDelete(Rule.Cascade)) + ; + + Execute.Sql(@"CREATE VIEW ViewBasedEntities AS SELECT Id, Field, RoleId FROM TableBasedEntity"); } public override void Down() diff --git a/src/entityframeworkcore/test/entityframeworkcore2.validation.tests/Support/Migrations/MigrationsMissingViews.cs b/src/entityframeworkcore/test/entityframeworkcore2.validation.tests/Support/Migrations/MigrationsMissingViews.cs index da36e9f..ed24d98 100644 --- a/src/entityframeworkcore/test/entityframeworkcore2.validation.tests/Support/Migrations/MigrationsMissingViews.cs +++ b/src/entityframeworkcore/test/entityframeworkcore2.validation.tests/Support/Migrations/MigrationsMissingViews.cs @@ -107,13 +107,22 @@ public override void Up() ; Create.Table("AspNetUserTokens") - .WithColumn("UserId", - col => col.AsInt32().NotNullable().PrimaryKey("PK_AspNetUserTokens") - .ForeignKey("FK_AspNetUserTokens_AspNetUsers_UserId", "AspNetUsers", "Id") - .OnDelete(Rule.Cascade)) - .WithColumn("LoginProvider", col => col.AsString(450).NotNullable().PrimaryKey("PK_AspNetUserTokens")) - .WithColumn("Name", col => col.AsString(450).NotNullable().PrimaryKey("PK_AspNetUserTokens")) - .WithColumn("Value", col => col.AsStringMax().Nullable()) + .WithColumn("UserId", + col => col.AsInt32().NotNullable().PrimaryKey("PK_AspNetUserTokens") + .ForeignKey("FK_AspNetUserTokens_AspNetUsers_UserId", "AspNetUsers", "Id") + .OnDelete(Rule.Cascade)) + .WithColumn("LoginProvider", col => col.AsString(450).NotNullable().PrimaryKey("PK_AspNetUserTokens")) + .WithColumn("Name", col => col.AsString(450).NotNullable().PrimaryKey("PK_AspNetUserTokens")) + .WithColumn("Value", col => col.AsStringMax().Nullable()) + ; + + Create.Table("TableBasedEntity") + .WithColumn("Id", col => col.AsInt32().NotNullable().PrimaryKey("PK_TableBasedEntity")) + .WithColumn("Field", col => col.AsString(256).Nullable()) + .WithColumn("RoleId", col => col.AsInt32().NotNullable() + .Indexed("IX_TableBasedEntity_RoleId") + .ForeignKey("FK_TableBasedEntity_AspNetRoles_RoleId", "AspNetRoles", "Id") + .OnDelete(Rule.Cascade)) ; } diff --git a/src/entityframeworkcore/test/entityframeworkcore2.validation.tests/Support/Migrations/MigrationsWithIncorrectColumnNullability.cs b/src/entityframeworkcore/test/entityframeworkcore2.validation.tests/Support/Migrations/MigrationsWithIncorrectColumnNullability.cs index ff3a70d..122cd93 100644 --- a/src/entityframeworkcore/test/entityframeworkcore2.validation.tests/Support/Migrations/MigrationsWithIncorrectColumnNullability.cs +++ b/src/entityframeworkcore/test/entityframeworkcore2.validation.tests/Support/Migrations/MigrationsWithIncorrectColumnNullability.cs @@ -116,7 +116,16 @@ public override void Up() .WithColumn("Value", col => col.AsStringMax().Nullable()) ; - Execute.Sql(@"CREATE VIEW ViewBasedEntities AS SELECT Id, Email FROM AspNetUsers"); + Create.Table("TableBasedEntity") + .WithColumn("Id", col => col.AsInt32().NotNullable().PrimaryKey("PK_TableBasedEntity")) + .WithColumn("Field", col => col.AsString(256).Nullable()) + .WithColumn("RoleId", col => col.AsInt32().NotNullable() + .Indexed("IX_TableBasedEntity_RoleId") + .ForeignKey("FK_TableBasedEntity_AspNetRoles_RoleId", "AspNetRoles", "Id") + .OnDelete(Rule.Cascade)) + ; + + Execute.Sql(@"CREATE VIEW ViewBasedEntities AS SELECT Id, Field, RoleId FROM TableBasedEntity"); } public override void Down() diff --git a/src/entityframeworkcore/test/entityframeworkcore2.validation.tests/Support/Migrations/MigrationsWithIncorrectColumnTypes.cs b/src/entityframeworkcore/test/entityframeworkcore2.validation.tests/Support/Migrations/MigrationsWithIncorrectColumnTypes.cs index cdf0123..d08d6e9 100644 --- a/src/entityframeworkcore/test/entityframeworkcore2.validation.tests/Support/Migrations/MigrationsWithIncorrectColumnTypes.cs +++ b/src/entityframeworkcore/test/entityframeworkcore2.validation.tests/Support/Migrations/MigrationsWithIncorrectColumnTypes.cs @@ -116,7 +116,16 @@ public override void Up() .WithColumn("Value", col => col.AsStringMax().Nullable()) ; - Execute.Sql(@"CREATE VIEW ViewBasedEntities AS SELECT Id, Email FROM AspNetUsers"); + Create.Table("TableBasedEntity") + .WithColumn("Id", col => col.AsInt32().NotNullable().PrimaryKey("PK_TableBasedEntity")) + .WithColumn("Field", col => col.AsString(256).Nullable()) + .WithColumn("RoleId", col => col.AsInt32().NotNullable() + .Indexed("IX_TableBasedEntity_RoleId") + .ForeignKey("FK_TableBasedEntity_AspNetRoles_RoleId", "AspNetRoles", "Id") + .OnDelete(Rule.Cascade)) + ; + + Execute.Sql(@"CREATE VIEW ViewBasedEntities AS SELECT Id, Field, RoleId FROM TableBasedEntity"); } public override void Down() diff --git a/src/entityframeworkcore/test/entityframeworkcore2.validation.tests/Support/Migrations/ValidIdentityMigrations.cs b/src/entityframeworkcore/test/entityframeworkcore2.validation.tests/Support/Migrations/ValidIdentityMigrations.cs index 12f871c..7f60348 100644 --- a/src/entityframeworkcore/test/entityframeworkcore2.validation.tests/Support/Migrations/ValidIdentityMigrations.cs +++ b/src/entityframeworkcore/test/entityframeworkcore2.validation.tests/Support/Migrations/ValidIdentityMigrations.cs @@ -116,7 +116,16 @@ public override void Up() .WithColumn("Value", col => col.AsStringMax().Nullable()) ; - Execute.Sql(@"CREATE VIEW ViewBasedEntities AS SELECT Id, Email FROM AspNetUsers"); + Create.Table("TableBasedEntity") + .WithColumn("Id", col => col.AsInt32().NotNullable().PrimaryKey("PK_TableBasedEntity")) + .WithColumn("Field", col => col.AsString(256).Nullable()) + .WithColumn("RoleId", col => col.AsInt32().NotNullable() + .Indexed("IX_TableBasedEntity_RoleId") + .ForeignKey("FK_TableBasedEntity_AspNetRoles_RoleId", "AspNetRoles", "Id") + .OnDelete(Rule.Cascade)) + ; + + Execute.Sql(@"CREATE VIEW ViewBasedEntities AS SELECT Id, Field, RoleId FROM TableBasedEntity"); } public override void Down() diff --git a/src/entityframeworkcore/test/entityframeworkcore2.validation.tests/Support/TableBasedEntity.cs b/src/entityframeworkcore/test/entityframeworkcore2.validation.tests/Support/TableBasedEntity.cs new file mode 100644 index 0000000..23f8db8 --- /dev/null +++ b/src/entityframeworkcore/test/entityframeworkcore2.validation.tests/Support/TableBasedEntity.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using Microsoft.AspNetCore.Identity; + +namespace Aranasoft.Cobweb.EntityFrameworkCore.Validation.Tests.Support { + public class TableBasedEntity { + public int Id { get; set; } + [MaxLength(256)] + public string Field { get; set; } + [Required] + public IdentityRole Role { get; set; } + public ViewBasedEntity ViewEntity { get; set; } + } +} diff --git a/src/entityframeworkcore/test/entityframeworkcore2.validation.tests/Support/TableBasedEntityMapping.cs b/src/entityframeworkcore/test/entityframeworkcore2.validation.tests/Support/TableBasedEntityMapping.cs new file mode 100644 index 0000000..96ee5a7 --- /dev/null +++ b/src/entityframeworkcore/test/entityframeworkcore2.validation.tests/Support/TableBasedEntityMapping.cs @@ -0,0 +1,11 @@ +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; + +namespace Aranasoft.Cobweb.EntityFrameworkCore.Validation.Tests.Support { + public class TableBasedEntityMapping : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder builder) { + builder.Ignore(entity => entity.ViewEntity); + } + } +} diff --git a/src/entityframeworkcore/test/entityframeworkcore2.validation.tests/Support/ViewBasedEntity.cs b/src/entityframeworkcore/test/entityframeworkcore2.validation.tests/Support/ViewBasedEntity.cs index 599ed51..4a1e879 100644 --- a/src/entityframeworkcore/test/entityframeworkcore2.validation.tests/Support/ViewBasedEntity.cs +++ b/src/entityframeworkcore/test/entityframeworkcore2.validation.tests/Support/ViewBasedEntity.cs @@ -1,10 +1,14 @@ using System; +using System.Collections.Generic; using System.ComponentModel.DataAnnotations; +using Microsoft.AspNetCore.Identity; namespace Aranasoft.Cobweb.EntityFrameworkCore.Validation.Tests.Support { public class ViewBasedEntity { public int Id { get; set; } [MaxLength(256)] - public string Email { get; set; } + public string Field { get; set; } + public IdentityRole Role { get; set; } + public TableBasedEntity TableEntity { get; set; } } } diff --git a/src/entityframeworkcore/test/entityframeworkcore2.validation.tests/Support/ViewBasedEntityMapping.cs b/src/entityframeworkcore/test/entityframeworkcore2.validation.tests/Support/ViewBasedEntityMapping.cs index d24cb8b..109e69d 100644 --- a/src/entityframeworkcore/test/entityframeworkcore2.validation.tests/Support/ViewBasedEntityMapping.cs +++ b/src/entityframeworkcore/test/entityframeworkcore2.validation.tests/Support/ViewBasedEntityMapping.cs @@ -6,6 +6,9 @@ public class ViewBasedEntityMapping : IQueryTypeConfiguration { public void Configure(QueryTypeBuilder builder) { builder.ToView("ViewBasedEntities"); + builder.Property("RoleId"); + builder.HasOne(entity => entity.TableEntity).WithOne().HasForeignKey(entity => entity.Id).HasPrincipalKey(entity => entity.Id); + builder.HasOne(entity => entity.Role).WithMany().HasForeignKey("RoleId"); } } } diff --git a/src/entityframeworkcore/test/entityframeworkcore3.validation.tests/Aranasoft.Cobweb.EntityFrameworkCore3.Validation.Tests.csproj b/src/entityframeworkcore/test/entityframeworkcore3.validation.tests/Aranasoft.Cobweb.EntityFrameworkCore3.Validation.Tests.csproj index 46fc7ea..b467520 100644 --- a/src/entityframeworkcore/test/entityframeworkcore3.validation.tests/Aranasoft.Cobweb.EntityFrameworkCore3.Validation.Tests.csproj +++ b/src/entityframeworkcore/test/entityframeworkcore3.validation.tests/Aranasoft.Cobweb.EntityFrameworkCore3.Validation.Tests.csproj @@ -38,6 +38,7 @@ + diff --git a/src/entityframeworkcore/test/entityframeworkcore3.validation.tests/Support/TableBasedEntityMapping.cs b/src/entityframeworkcore/test/entityframeworkcore3.validation.tests/Support/TableBasedEntityMapping.cs new file mode 100644 index 0000000..8e34deb --- /dev/null +++ b/src/entityframeworkcore/test/entityframeworkcore3.validation.tests/Support/TableBasedEntityMapping.cs @@ -0,0 +1,10 @@ +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; + +namespace Aranasoft.Cobweb.EntityFrameworkCore.Validation.Tests.Support { + public class TableBasedEntityMapping : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder builder) { + } + } +} diff --git a/src/entityframeworkcore/test/entityframeworkcore3.validation.tests/Support/ViewBasedEntityMapping.cs b/src/entityframeworkcore/test/entityframeworkcore3.validation.tests/Support/ViewBasedEntityMapping.cs index fbdc877..afee4db 100644 --- a/src/entityframeworkcore/test/entityframeworkcore3.validation.tests/Support/ViewBasedEntityMapping.cs +++ b/src/entityframeworkcore/test/entityframeworkcore3.validation.tests/Support/ViewBasedEntityMapping.cs @@ -6,6 +6,7 @@ public class ViewBasedEntityMapping : IEntityTypeConfiguration { public void Configure(EntityTypeBuilder builder) { builder.ToView("ViewBasedEntities"); + builder.HasOne(viewBasedEntity => viewBasedEntity.TableEntity).WithOne(tableBasedEntity => tableBasedEntity.ViewEntity).HasForeignKey(entity => entity.Id); } } }