protected override void OnModelCreating(ModelBuilder builder)
        {
            //AppUser
            AppUserService.CreatePasswordHash("admin-password", out string hash, out string salt);
            var superAdmin = new AppUser
            {
                UserName     = "******",
                Name         = "Super Admin",
                Email        = "*****@*****.**",
                PhoneNumber  = "+2348165859398",
                Role         = Role.SuperAdmin,
                PasswordHash = hash,
                PasswordSalt = salt
            };
            var admin = new AppUser
            {
                UserName     = "******",
                Name         = "Admin",
                Role         = Role.Admin,
                PasswordHash = hash,
                PasswordSalt = salt
            };

            //builder.Entity<AppUser>().HasData(superAdmin, admin);

            builder.Entity <AppUser>()
            .HasOne(u => u.Location)
            .WithMany(l => l.AppUsers)
            .OnDelete(DeleteBehavior.Restrict);
            builder.Entity <AppUser>()
            .HasOne(u => u.Business)
            .WithMany(b => b.AppUsers)
            .OnDelete(DeleteBehavior.Restrict);
            //Category
            builder.Entity <Category>()
            .HasIndex(c => new { c.BusinessId, c.Name }).HasName("Business_Category_Name").IsUnique();
            builder.Entity <Category>()
            .HasIndex(c => new { c.BusinessId, c.Code }).HasName("Business_Category_Code").IsUnique();
            //SubCategory
            builder.Entity <SubCategory>()
            .HasIndex(s => new { s.Name, s.CategoryId }).HasName("SubCategory_Name_CategoryId").IsUnique();
            //Item
            builder.Entity <Item>()
            .HasOne(i => i.Category)
            .WithMany(c => c.Items)
            .OnDelete(DeleteBehavior.Restrict);
            builder.Entity <Item>()
            .HasAlternateKey(i => new { i.CategoryId, i.Code }).HasName("Category_Item_Code");
            builder.Entity <Item>()
            .HasIndex(i => new { i.CategoryId, i.Description }).HasName("Category_Item_Description");
            builder.Entity <Item>()
            .Property(i => i.UnitCost)
            .HasColumnType("decimal(10,2)");
            builder.Entity <Item>()
            .Property(i => i.UnitPrice)
            .HasColumnType("decimal(10,2)");
            //SaleItem
            builder.Entity <SaleItem>()
            .HasKey(l => new { l.SaleId, l.ItemId })
            .HasName("SaleItem_Id");
            builder.Entity <SaleItem>()
            .Property(s => s.UnitPrice)
            .HasColumnType("decimal(10,2)");
            //Sale
            builder.Entity <Sale>()
            .HasIndex(s => new { s.LocationId, s.ReferenceNumber }).HasName("Location_Sale_ReferenceNumber").IsUnique();
            //Supply
            builder.Entity <Supply>()
            .HasIndex(s => new { s.LocationId, s.ReferenceNumber }).HasName("Location_Supply_ReferenceNumber").IsUnique();
            //LocationItem
            builder.Entity <LocationItem>()
            .HasKey(l => new { l.LocationId, l.ItemId })
            .HasName("LocationItem_Id");
            builder.Entity <LocationItem>()
            .Property(i => i.UnitPrice)
            .HasColumnType("decimal(10,2)");
            //Location
            builder.Entity <Location>()
            .HasAlternateKey(l => l.Code).HasName("Location_Code");
            builder.Entity <Location>()
            .HasIndex(l => new { l.BusinessId, l.Name }).HasName("Business_Location_Name").IsUnique();
            builder.Entity <Location>()
            .Property(l => l.Target)
            .HasColumnType("decimal(12,2)");
            builder.Entity <Location>()
            .HasMany(l => l.OutgoingTransfers)
            .WithOne(t => t.SourceLocation)
            .OnDelete(DeleteBehavior.Restrict);
            builder.Entity <Location>()
            .HasMany(l => l.IncomingTransfers)
            .WithOne(t => t.DestinationLocation)
            .OnDelete(DeleteBehavior.Restrict);
            //PurchaseOrderItem
            builder.Entity <PurchaseOrderItem>()
            .HasKey(l => new { l.PurchaseOrderId, l.ItemId })
            .HasName("PurchaseOrderItem_Id");
            builder.Entity <PurchaseOrderItem>()
            .Property(p => p.UnitCost)
            .HasColumnType("decimal(10,2)");
            //TransferItem
            builder.Entity <TransferItem>()
            .HasKey(l => new { l.TransferId, l.ItemId })
            .HasName("TransferItem_Id");
            //InvoiceItem
            builder.Entity <InvoiceItem>()
            .HasKey(l => new { l.InvoiceId, l.ItemId })
            .HasName("InvoiceItem_Id");
            //SupplyItem
            builder.Entity <SupplyItem>()
            .HasKey(s => new { s.SupplyId, s.ItemId })
            .HasName("SupplyItem_Id");
            builder.Entity <SupplyItem>()
            .Property(s => s.UnitPrice)
            .HasColumnType("decimal(10,2)");
            //ReportItem
            builder.Entity <ReportItem>()
            .HasKey(l => new { l.ReportGroupId, l.ItemId })
            .HasName("ReportItem_Id");
            //Supplier
            builder.Entity <Supplier>()
            .HasIndex(s => new { s.BusinessId, s.SupplierNumber }).HasName("Business_Supplier_Number").IsUnique();
            builder.Entity <Supplier>()
            .HasIndex(s => new { s.BusinessId, s.Name }).HasName("Business_Supplier_Name").IsUnique();
            //Manufacturer
            builder.Entity <Manufacturer>()
            .HasIndex(m => new { m.BusinessId, m.Name }).HasName("Business_Manufacturer_Name").IsUnique();
            //PurchaseOrder
            builder.Entity <PurchaseOrder>()
            .HasIndex(p => new { p.LocationId, p.OrderNumber }).HasName("Business_Order_Number").IsUnique();
            //Transfer
            builder.Entity <Transfer>()
            .HasIndex(t => new { t.SourceLocationId, t.DestinationLocationId, t.TransferNumber }).HasName("Location_Transfer_Number").IsUnique();
            //Invoice
            builder.Entity <Invoice>()
            .HasIndex(i => i.InvoiceNumber).HasName("Invoice_Number").IsUnique();
            //Receipt
            builder.Entity <Receipt>()
            .HasIndex(r => r.ReceiptNumber).HasName("Receipt_Number").IsUnique();
            builder.Entity <Receipt>()
            .Property(r => r.CashPaid)
            .HasColumnType("decimal(10,2)");
            //Unit
            builder.Entity <Unit>()
            .HasIndex(u => u.Name)
            .HasName("Unit_Name");

            base.OnModelCreating(builder);
        }