public void ScaffoldingOrderClass()
        {
            // Arrange
            var definition = new CSharpClassDefinition
            {
                Namespaces =
                {
                    "System",
                    "System.ComponentModel.DataAnnotations",
                    "System.ComponentModel.DataAnnotations.Schema"
                },
                Namespace      = "DesignPatterns",
                AccessModifier = AccessModifier.Public,
                Name           = "Order"
            };

            definition.Attributes.Add(new MetadataAttribute("Table", "\"Orders\"")
            {
                Sets =
                {
                    new MetadataAttributeSet("Schema", "\"dbo\"")
                }
            });

            definition.Properties.Add(
                CSharpClassDefinition.CreateAutomaticProperty("Int32?", "OrderID", attributes: new[]
            {
                new MetadataAttribute("Key"),
                new MetadataAttribute("DatabaseGenerated", "DatabaseGeneratedOption.Identity")
            })
                );

            definition.Properties.Add(
                CSharpClassDefinition.CreateAutomaticProperty("DateTime?", "OrderDate", attributes: new[] { new MetadataAttribute("Column") })
                );

            definition.Properties.Add(
                CSharpClassDefinition.CreateAutomaticProperty("String", "CustomerID", attributes: new[]
            {
                new MetadataAttribute("Column"),
                new MetadataAttribute("StringLength", "5")
            })
                );

            definition.Properties.Add(
                CSharpClassDefinition.CreateAutomaticProperty("Int32?", "ShipperID", attributes: new[] { new MetadataAttribute("Column") })
                );

            definition.SimplifyDataTypes();

            // Act
            CSharpCodeBuilder.CreateFiles(@"C:\Temp\CatFactory.NetCore\DesignPatterns", string.Empty, true, definition);
        }
        public void ScaffoldingDbContextClass()
        {
            // Arrange
            var definition = new CSharpClassDefinition
            {
                Namespaces =
                {
                    "System",
                    "Microsoft.EntityFrameworkCore"
                },
                Documentation  = new Documentation("Represents Northwind database in EF Core Model"),
                Namespace      = "DesignPatterns",
                AccessModifier = AccessModifier.Public,
                IsPartial      = true,
                Name           = "NorthwindDbContext",
                BaseClass      = "DbContext",
                Constructors   =
                {
                    new ClassConstructorDefinition
                    {
                        AccessModifier = AccessModifier.Public,
                        Invocation     = "base(options)",
                        Documentation  = new Documentation("Initializes a new instance of NorthwindDbContext class"),
                        Parameters     =
                        {
                            new ParameterDefinition("DbContextOptions<NorthwindDbContext>", "options")
                            {
                                Documentation = new Documentation("Instance of DbContext options")
                            }
                        }
                    }
                },
                Properties =
                {
                    CSharpClassDefinition.CreateAutomaticProperty("DbSet<Product>", "Products"),
                    CSharpClassDefinition.CreateAutomaticProperty("DbSet<Shipper>", "Shippers"),
                    CSharpClassDefinition.CreateAutomaticProperty("DbSet<Order>",   "Orders")
                },
                Methods =
                {
                    new MethodDefinition(AccessModifier.Protected,                      "",                                                                  "OnModelCreating", new ParameterDefinition("ModelBuilder", "modelBuilder"))
                    {
                        IsOverride = true,
                        Lines      =
                        {
                            new CodeLine("modelBuilder.Entity<Product>(builder =>"),
                            new CodeLine("{"),
                            new CommentLine(1,                                         " Add configuration for 'dbo.Products' table"),
                            new CodeLine(),
                            new CodeLine(1,                                            "builder.ToTable(\"Products\", \"dbo\");"),
                            new CodeLine(),
                            new CodeLine(1,                                            "builder.Property(p => p.ProductID).UseSqlServerIdentityColumn();"),
                            new CodeLine(),
                            new CodeLine(1,                                            "builder.HasKey(p => p.ProductID);"),
                            new CodeLine("});"),
                            new CodeLine(),
                            new CommentLine(" Register results for stored procedures"),
                            new CodeLine(),
                            new CommentLine(" 'dbo.CustOrderHist'"),
                            new CodeLine("modelBuilder.Query<CustOrderHist>();")
                        }
                    }
                }
            };

            // Act
            CSharpCodeBuilder.CreateFiles(@"C:\Temp\CatFactory.NetCore\DesignPatterns", string.Empty, true, definition);
        }