[{"data":1,"prerenderedAt":2086},["ShallowReactive",2],{"navigation_docs":3,"-phong-van-ngan-hang-cau-hoi-aspnet-ef":420,"-phong-van-ngan-hang-cau-hoi-aspnet-ef-surround":2081},[4,153],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":26},"Phỏng vấn .NET","i-lucide-briefcase","\u002Fphong-van","1.phong-van",[10,27,66,111,128],{"title":11,"icon":12,"path":13,"stem":14,"children":15,"page":26},"Tổng quan","i-lucide-compass","\u002Fphong-van\u002Ftong-quan","1.phong-van\u002F1.tong-quan",[16,21],{"title":17,"path":18,"stem":19,"icon":20},"Thị trường HCM","\u002Fphong-van\u002Ftong-quan\u002Fthi-truong","1.phong-van\u002F1.tong-quan\u002F1.thi-truong","i-lucide-trending-up",{"title":22,"path":23,"stem":24,"icon":25},"Lộ trình 7 ngày","\u002Fphong-van\u002Ftong-quan\u002Flo-trinh","1.phong-van\u002F1.tong-quan\u002F2.lo-trinh","i-lucide-calendar-days",false,{"title":22,"icon":25,"path":28,"stem":29,"children":30,"page":26},"\u002Fphong-van\u002Flo-trinh","1.phong-van\u002F2.lo-trinh",[31,36,41,46,51,56,61],{"title":32,"path":33,"stem":34,"icon":35},"Ngày 1 — C# cơ bản","\u002Fphong-van\u002Flo-trinh\u002Fngay-1-csharp-co-ban","1.phong-van\u002F2.lo-trinh\u002F1.ngay-1-csharp-co-ban","i-lucide-1",{"title":37,"path":38,"stem":39,"icon":40},"Ngày 2 — OOP và SOLID","\u002Fphong-van\u002Flo-trinh\u002Fngay-2-oop-solid","1.phong-van\u002F2.lo-trinh\u002F2.ngay-2-oop-solid","i-lucide-2",{"title":42,"path":43,"stem":44,"icon":45},"Ngày 3 — C# nâng cao","\u002Fphong-van\u002Flo-trinh\u002Fngay-3-csharp-nang-cao","1.phong-van\u002F2.lo-trinh\u002F3.ngay-3-csharp-nang-cao","i-lucide-3",{"title":47,"path":48,"stem":49,"icon":50},"Ngày 4 — Database và SQL","\u002Fphong-van\u002Flo-trinh\u002Fngay-4-database-sql","1.phong-van\u002F2.lo-trinh\u002F4.ngay-4-database-sql","i-lucide-4",{"title":52,"path":53,"stem":54,"icon":55},"Ngày 5 — ASP.NET Core và EF Core","\u002Fphong-van\u002Flo-trinh\u002Fngay-5-aspnet-efcore","1.phong-van\u002F2.lo-trinh\u002F5.ngay-5-aspnet-efcore","i-lucide-5",{"title":57,"path":58,"stem":59,"icon":60},"Ngày 6 — DSA coding","\u002Fphong-van\u002Flo-trinh\u002Fngay-6-dsa","1.phong-van\u002F2.lo-trinh\u002F6.ngay-6-dsa","i-lucide-6",{"title":62,"path":63,"stem":64,"icon":65},"Ngày 7 — Mock và HR","\u002Fphong-van\u002Flo-trinh\u002Fngay-7-mock-interview","1.phong-van\u002F2.lo-trinh\u002F7.ngay-7-mock-interview","i-lucide-7",{"title":67,"icon":68,"path":69,"stem":70,"children":71,"page":26},"Ngân hàng câu hỏi","i-lucide-database","\u002Fphong-van\u002Fngan-hang-cau-hoi","1.phong-van\u002F3.ngan-hang-cau-hoi",[72,77,82,87,92,97,102,107],{"title":73,"path":74,"stem":75,"icon":76},"C# (60+ câu)","\u002Fphong-van\u002Fngan-hang-cau-hoi\u002Fcsharp","1.phong-van\u002F3.ngan-hang-cau-hoi\u002F1.csharp","i-lucide-hash",{"title":78,"path":79,"stem":80,"icon":81},"OOP và SOLID (40+)","\u002Fphong-van\u002Fngan-hang-cau-hoi\u002Foop","1.phong-van\u002F3.ngan-hang-cau-hoi\u002F2.oop","i-lucide-shapes",{"title":83,"path":84,"stem":85,"icon":86},"SQL (40+)","\u002Fphong-van\u002Fngan-hang-cau-hoi\u002Fsql","1.phong-van\u002F3.ngan-hang-cau-hoi\u002F3.sql","i-lucide-database-zap",{"title":88,"path":89,"stem":90,"icon":91},"ASP.NET và EF (50+)","\u002Fphong-van\u002Fngan-hang-cau-hoi\u002Faspnet-ef","1.phong-van\u002F3.ngan-hang-cau-hoi\u002F4.aspnet-ef","i-lucide-server",{"title":93,"path":94,"stem":95,"icon":96},"DSA và Coding (30+)","\u002Fphong-van\u002Fngan-hang-cau-hoi\u002Fdsa-coding","1.phong-van\u002F3.ngan-hang-cau-hoi\u002F5.dsa-coding","i-lucide-binary",{"title":98,"path":99,"stem":100,"icon":101},"HR và Soft skill (25+)","\u002Fphong-van\u002Fngan-hang-cau-hoi\u002Fhr-behavior","1.phong-van\u002F3.ngan-hang-cau-hoi\u002F6.hr-behavior","i-lucide-users",{"title":103,"path":104,"stem":105,"icon":106},"Design Pattern (55+)","\u002Fphong-van\u002Fngan-hang-cau-hoi\u002Fdesign-pattern","1.phong-van\u002F3.ngan-hang-cau-hoi\u002F7.design-pattern","i-lucide-puzzle",{"title":108,"path":109,"stem":110,"icon":91},"ASP.NET MVC và Web API","\u002Fphong-van\u002Fngan-hang-cau-hoi\u002Faspnet-mvc-webapi","1.phong-van\u002F3.ngan-hang-cau-hoi\u002F8.aspnet-mvc-webapi",{"title":112,"itle":113,"icon":114,"path":115,"stem":116,"children":117,"page":26},"Tai Lieu","Tài liệu và Cheat sheet","i-lucide-book-marked","\u002Fphong-van\u002Ftai-lieu","1.phong-van\u002F4.tai-lieu",[118,123],{"title":119,"path":120,"stem":121,"icon":122},"Cheat Sheet","\u002Fphong-van\u002Ftai-lieu\u002Fcheatsheet","1.phong-van\u002F4.tai-lieu\u002F1.cheatsheet","i-lucide-clipboard-list",{"title":124,"path":125,"stem":126,"icon":127},"Nguồn tham khảo","\u002Fphong-van\u002Ftai-lieu\u002Fnguon","1.phong-van\u002F4.tai-lieu\u002F2.nguon","i-lucide-link",{"title":129,"icon":130,"path":131,"stem":132,"children":133,"page":26},"Phỏng vấn English","i-lucide-globe","\u002Fphong-van\u002Fenglish-interview","1.phong-van\u002F5.english-interview",[134,138,143,148],{"title":135,"path":136,"stem":137,"icon":130},"Tổng quan English","\u002Fphong-van\u002Fenglish-interview\u002Ftong-quan","1.phong-van\u002F5.english-interview\u002F1.tong-quan",{"title":139,"path":140,"stem":141,"icon":142},"Vocabulary","\u002Fphong-van\u002Fenglish-interview\u002Fvocabulary","1.phong-van\u002F5.english-interview\u002F2.vocabulary","i-lucide-book-a",{"title":144,"path":145,"stem":146,"icon":147},"Technical Q và A (EN)","\u002Fphong-van\u002Fenglish-interview\u002Ftechnical-en","1.phong-van\u002F5.english-interview\u002F3.technical-en","i-lucide-code",{"title":149,"path":150,"stem":151,"icon":152},"Behavioral (EN)","\u002Fphong-van\u002Fenglish-interview\u002Fbehavioral-en","1.phong-van\u002F5.english-interview\u002F4.behavioral-en","i-lucide-message-square-text",{"title":154,"icon":155,"path":156,"stem":157,"children":158},"Tự học","i-lucide-graduation-cap","\u002Ftu-hoc","2.tu-hoc",[159,161,287,310,333,357,384],{"title":154,"path":156,"stem":160,"icon":155},"2.tu-hoc\u002Findex",{"title":162,"icon":68,"path":163,"stem":164,"children":165},"Database","\u002Ftu-hoc\u002Fdatabase","2.tu-hoc\u002F1.database\u002Findex",[166,167,197,222,243,248],{"title":162,"path":163,"stem":164,"icon":68},{"title":168,"icon":91,"path":169,"stem":170,"children":171,"page":26},"SQL Server","\u002Ftu-hoc\u002Fdatabase\u002Fsql-server","2.tu-hoc\u002F1.database\u002F2.sql-server",[172,177,182,187,192],{"title":173,"path":174,"stem":175,"icon":176},"1. Giới thiệu và Cài đặt","\u002Ftu-hoc\u002Fdatabase\u002Fsql-server\u002Fgioi-thieu-cai-dat","2.tu-hoc\u002F1.database\u002F2.sql-server\u002F1.gioi-thieu-cai-dat","i-lucide-play-circle",{"title":178,"path":179,"stem":180,"icon":181},"2. Cú pháp cơ bản","\u002Ftu-hoc\u002Fdatabase\u002Fsql-server\u002Fcu-phap-co-ban","2.tu-hoc\u002F1.database\u002F2.sql-server\u002F2.cu-phap-co-ban","i-lucide-code-2",{"title":183,"path":184,"stem":185,"icon":186},"3. Truy vấn nâng cao","\u002Ftu-hoc\u002Fdatabase\u002Fsql-server\u002Ftruy-van-nang-cao","2.tu-hoc\u002F1.database\u002F2.sql-server\u002F3.truy-van-nang-cao","i-lucide-git-merge",{"title":188,"path":189,"stem":190,"icon":191},"4. Đặc thù và Performance","\u002Ftu-hoc\u002Fdatabase\u002Fsql-server\u002Fdac-thu-performance","2.tu-hoc\u002F1.database\u002F2.sql-server\u002F4.dac-thu-performance","i-lucide-gauge",{"title":193,"path":194,"stem":195,"icon":196},"5. Q và A phỏng vấn","\u002Ftu-hoc\u002Fdatabase\u002Fsql-server\u002Fcau-hoi-phong-van","2.tu-hoc\u002F1.database\u002F2.sql-server\u002F5.cau-hoi-phong-van","i-lucide-message-circle-question",{"title":198,"icon":199,"path":200,"stem":201,"children":202,"page":26},"PostgreSQL","i-simple-icons-postgresql","\u002Ftu-hoc\u002Fdatabase\u002Fpostgresql","2.tu-hoc\u002F1.database\u002F3.postgresql",[203,206,209,212,215,218],{"title":173,"path":204,"stem":205,"icon":176},"\u002Ftu-hoc\u002Fdatabase\u002Fpostgresql\u002Fgioi-thieu-cai-dat","2.tu-hoc\u002F1.database\u002F3.postgresql\u002F1.gioi-thieu-cai-dat",{"title":178,"path":207,"stem":208,"icon":181},"\u002Ftu-hoc\u002Fdatabase\u002Fpostgresql\u002Fcu-phap-co-ban","2.tu-hoc\u002F1.database\u002F3.postgresql\u002F2.cu-phap-co-ban",{"title":183,"path":210,"stem":211,"icon":186},"\u002Ftu-hoc\u002Fdatabase\u002Fpostgresql\u002Ftruy-van-nang-cao","2.tu-hoc\u002F1.database\u002F3.postgresql\u002F3.truy-van-nang-cao",{"title":188,"path":213,"stem":214,"icon":191},"\u002Ftu-hoc\u002Fdatabase\u002Fpostgresql\u002Fdac-thu-performance","2.tu-hoc\u002F1.database\u002F3.postgresql\u002F4.dac-thu-performance",{"title":193,"path":216,"stem":217,"icon":196},"\u002Ftu-hoc\u002Fdatabase\u002Fpostgresql\u002Fcau-hoi-phong-van","2.tu-hoc\u002F1.database\u002F3.postgresql\u002F5.cau-hoi-phong-van",{"title":219,"path":220,"stem":221,"icon":96},"6. Tích hợp C# và Postgres","\u002Ftu-hoc\u002Fdatabase\u002Fpostgresql\u002Ftich-hop-csharp","2.tu-hoc\u002F1.database\u002F3.postgresql\u002F6.tich-hop-csharp",{"title":223,"icon":224,"path":225,"stem":226,"children":227,"page":26},"MySQL","i-simple-icons-mysql","\u002Ftu-hoc\u002Fdatabase\u002Fmysql","2.tu-hoc\u002F1.database\u002F4.mysql",[228,231,234,237,240],{"title":173,"path":229,"stem":230,"icon":176},"\u002Ftu-hoc\u002Fdatabase\u002Fmysql\u002Fgioi-thieu-cai-dat","2.tu-hoc\u002F1.database\u002F4.mysql\u002F1.gioi-thieu-cai-dat",{"title":178,"path":232,"stem":233,"icon":181},"\u002Ftu-hoc\u002Fdatabase\u002Fmysql\u002Fcu-phap-co-ban","2.tu-hoc\u002F1.database\u002F4.mysql\u002F2.cu-phap-co-ban",{"title":183,"path":235,"stem":236,"icon":186},"\u002Ftu-hoc\u002Fdatabase\u002Fmysql\u002Ftruy-van-nang-cao","2.tu-hoc\u002F1.database\u002F4.mysql\u002F3.truy-van-nang-cao",{"title":188,"path":238,"stem":239,"icon":191},"\u002Ftu-hoc\u002Fdatabase\u002Fmysql\u002Fdac-thu-performance","2.tu-hoc\u002F1.database\u002F4.mysql\u002F4.dac-thu-performance",{"title":193,"path":241,"stem":242,"icon":196},"\u002Ftu-hoc\u002Fdatabase\u002Fmysql\u002Fcau-hoi-phong-van","2.tu-hoc\u002F1.database\u002F4.mysql\u002F5.cau-hoi-phong-van",{"title":244,"path":245,"stem":246,"icon":247},"So sánh 3 RDBMS","\u002Ftu-hoc\u002Fdatabase\u002Fso-sanh","2.tu-hoc\u002F1.database\u002F5.so-sanh","i-lucide-columns-3",{"title":249,"path":250,"stem":251,"children":252,"icon":254},"Supabase (BaaS)","\u002Ftu-hoc\u002Fdatabase\u002Fsupabase","2.tu-hoc\u002F1.database\u002F6.supabase\u002Findex",[253,255,259,264,269,274,278,283],{"title":249,"path":250,"stem":251,"icon":254},"i-simple-icons-supabase",{"title":256,"path":257,"stem":258,"icon":68},"1. Database","\u002Ftu-hoc\u002Fdatabase\u002Fsupabase\u002Fdatabase","2.tu-hoc\u002F1.database\u002F6.supabase\u002F1.database",{"title":260,"path":261,"stem":262,"icon":263},"2. Authentication","\u002Ftu-hoc\u002Fdatabase\u002Fsupabase\u002Fauthentication","2.tu-hoc\u002F1.database\u002F6.supabase\u002F2.authentication","i-lucide-key",{"title":265,"path":266,"stem":267,"icon":268},"3. Storage & Realtime","\u002Ftu-hoc\u002Fdatabase\u002Fsupabase\u002Fstorage-realtime","2.tu-hoc\u002F1.database\u002F6.supabase\u002F3.storage-realtime","i-lucide-zap",{"title":270,"path":271,"stem":272,"icon":273},"4. Edge Functions & AI","\u002Ftu-hoc\u002Fdatabase\u002Fsupabase\u002Ffunctions-ai","2.tu-hoc\u002F1.database\u002F6.supabase\u002F4.functions-ai","i-lucide-brain",{"title":275,"path":276,"stem":277,"icon":181},"5. API & SDKs","\u002Ftu-hoc\u002Fdatabase\u002Fsupabase\u002Fapi-sdk","2.tu-hoc\u002F1.database\u002F6.supabase\u002F5.api-sdk",{"title":279,"path":280,"stem":281,"icon":282},"6. Platform & Deploy","\u002Ftu-hoc\u002Fdatabase\u002Fsupabase\u002Fplatform-deploy","2.tu-hoc\u002F1.database\u002F6.supabase\u002F6.platform-deploy","i-lucide-cloud",{"title":284,"path":285,"stem":286,"icon":196},"7. Interview & Q&A","\u002Ftu-hoc\u002Fdatabase\u002Fsupabase\u002Finterview","2.tu-hoc\u002F1.database\u002F6.supabase\u002F7.interview",{"title":288,"icon":289,"path":290,"stem":291,"children":292},"TypeScript","i-simple-icons-typescript","\u002Ftu-hoc\u002Ftypescript","2.tu-hoc\u002F2.typescript\u002Findex",[293,294,297,301,306],{"title":288,"path":290,"stem":291,"icon":289},{"title":173,"path":295,"stem":296,"icon":176},"\u002Ftu-hoc\u002Ftypescript\u002Fgioi-thieu-cai-dat","2.tu-hoc\u002F2.typescript\u002F1.gioi-thieu-cai-dat",{"title":298,"path":299,"stem":300,"icon":81},"2. Type System","\u002Ftu-hoc\u002Ftypescript\u002Ftype-system","2.tu-hoc\u002F2.typescript\u002F2.type-system",{"title":302,"path":303,"stem":304,"icon":305},"3. Advanced types","\u002Ftu-hoc\u002Ftypescript\u002Fadvanced-types","2.tu-hoc\u002F2.typescript\u002F3.advanced-types","i-lucide-braces",{"title":307,"path":308,"stem":309,"icon":196},"4. Q và A phỏng vấn","\u002Ftu-hoc\u002Ftypescript\u002Fcau-hoi-phong-van","2.tu-hoc\u002F2.typescript\u002F4.cau-hoi-phong-van",{"title":311,"icon":81,"path":312,"stem":313,"children":314},"OOP","\u002Ftu-hoc\u002Foop","2.tu-hoc\u002F3.oop\u002Findex",[315,316,321,326,330],{"title":311,"path":312,"stem":313,"icon":81},{"title":317,"path":318,"stem":319,"icon":320},"1. Bốn tính chất","\u002Ftu-hoc\u002Foop\u002F4-tinh-chat","2.tu-hoc\u002F3.oop\u002F1.4-tinh-chat","i-lucide-circle-dot",{"title":322,"path":323,"stem":324,"icon":325},"2. SOLID","\u002Ftu-hoc\u002Foop\u002Fsolid","2.tu-hoc\u002F3.oop\u002F2.solid","i-lucide-shield",{"title":327,"path":328,"stem":329,"icon":106},"3. Design Pattern","\u002Ftu-hoc\u002Foop\u002Fdesign-pattern","2.tu-hoc\u002F3.oop\u002F3.design-pattern",{"title":307,"path":331,"stem":332,"icon":196},"\u002Ftu-hoc\u002Foop\u002Fcau-hoi-phong-van","2.tu-hoc\u002F3.oop\u002F4.cau-hoi-phong-van",{"title":334,"icon":305,"path":335,"stem":336,"children":337},"Generic","\u002Ftu-hoc\u002Fgeneric","2.tu-hoc\u002F4.generic\u002Findex",[338,339,344,349,354],{"title":334,"path":335,"stem":336,"icon":305},{"title":340,"path":341,"stem":342,"icon":343},"1. Khái niệm và cú pháp","\u002Ftu-hoc\u002Fgeneric\u002Fkhai-niem","2.tu-hoc\u002F4.generic\u002F1.khai-niem","i-lucide-book",{"title":345,"path":346,"stem":347,"icon":348},"2. Constraint và Variance","\u002Ftu-hoc\u002Fgeneric\u002Fconstraint-variance","2.tu-hoc\u002F4.generic\u002F2.constraint-variance","i-lucide-filter",{"title":350,"path":351,"stem":352,"icon":353},"3. C# vs TS","\u002Ftu-hoc\u002Fgeneric\u002Fso-sanh","2.tu-hoc\u002F4.generic\u002F3.so-sanh","i-lucide-git-compare",{"title":307,"path":355,"stem":356,"icon":196},"\u002Ftu-hoc\u002Fgeneric\u002Fcau-hoi-phong-van","2.tu-hoc\u002F4.generic\u002F4.cau-hoi-phong-van",{"title":358,"icon":359,"path":360,"stem":361,"children":362},"Nuxt 4","i-simple-icons-nuxt","\u002Ftu-hoc\u002Fnuxt-4","2.tu-hoc\u002F5.nuxt-4\u002Findex",[363,364,367,372,376,379],{"title":358,"path":360,"stem":361,"icon":359},{"title":173,"path":365,"stem":366,"icon":176},"\u002Ftu-hoc\u002Fnuxt-4\u002Fgioi-thieu-cai-dat","2.tu-hoc\u002F5.nuxt-4\u002F1.gioi-thieu-cai-dat",{"title":368,"path":369,"stem":370,"icon":371},"2. Routing và Rendering","\u002Ftu-hoc\u002Fnuxt-4\u002Frouting-rendering","2.tu-hoc\u002F5.nuxt-4\u002F2.routing-rendering","i-lucide-route",{"title":373,"path":374,"stem":375,"icon":91},"3. Data và Server","\u002Ftu-hoc\u002Fnuxt-4\u002Fdata-server","2.tu-hoc\u002F5.nuxt-4\u002F3.data-server",{"title":307,"path":377,"stem":378,"icon":196},"\u002Ftu-hoc\u002Fnuxt-4\u002Fcau-hoi-phong-van","2.tu-hoc\u002F5.nuxt-4\u002F4.cau-hoi-phong-van",{"title":380,"path":381,"stem":382,"icon":383},"5. Practical Todo App","\u002Ftu-hoc\u002Fnuxt-4\u002Fpractical-todo-app","2.tu-hoc\u002F5.nuxt-4\u002F5.practical-todo-app","i-lucide-check-square",{"title":385,"path":386,"stem":387,"children":388,"icon":390},"Tailwind CSS","\u002Ftu-hoc\u002Ftailwindcss","2.tu-hoc\u002F6.tailwindcss\u002Findex",[389,391,396,401,406,411,416],{"title":385,"path":386,"stem":387,"icon":390},"i-simple-icons-tailwindcss",{"title":392,"path":393,"stem":394,"icon":395},"1. Layout & Spacing","\u002Ftu-hoc\u002Ftailwindcss\u002Flayout-spacing","2.tu-hoc\u002F6.tailwindcss\u002F1.layout-spacing","i-lucide-layout",{"title":397,"path":398,"stem":399,"icon":400},"2. Typography & Colors","\u002Ftu-hoc\u002Ftailwindcss\u002Ftypography-colors","2.tu-hoc\u002F6.tailwindcss\u002F2.typography-colors","i-lucide-type",{"title":402,"path":403,"stem":404,"icon":405},"3. Interactive & Effects","\u002Ftu-hoc\u002Ftailwindcss\u002Finteractive-effects","2.tu-hoc\u002F6.tailwindcss\u002F3.interactive-effects","i-lucide-sparkles",{"title":407,"path":408,"stem":409,"icon":410},"4. Responsive & Dark Mode","\u002Ftu-hoc\u002Ftailwindcss\u002Fresponsive-darkmode","2.tu-hoc\u002F6.tailwindcss\u002F4.responsive-darkmode","i-lucide-monitor-smartphone",{"title":412,"path":413,"stem":414,"icon":415},"5. Customization & Theme","\u002Ftu-hoc\u002Ftailwindcss\u002Fcustomization","2.tu-hoc\u002F6.tailwindcss\u002F5.customization","i-lucide-settings-2",{"title":417,"path":418,"stem":419,"icon":181},"6. Practical Projects","\u002Ftu-hoc\u002Ftailwindcss\u002Fpractical-projects","2.tu-hoc\u002F6.tailwindcss\u002F6.practical-projects",{"id":421,"title":422,"body":423,"description":2074,"extension":2075,"links":2076,"meta":2077,"navigation":2078,"path":89,"seo":2079,"stem":90,"__hash__":2080},"docs\u002F1.phong-van\u002F3.ngan-hang-cau-hoi\u002F4.aspnet-ef.md","Ngân hàng câu hỏi ASP.NET Core và EF Core",{"type":424,"value":425,"toc":1993},"minimark",[426,431,436,463,475,479,482,496,500,518,522,536,540,548,552,556,576,580,583,587,652,662,670,673,695,705,719,736,740,744,751,755,758,766,780,803,807,869,873,876,906,910,914,934,942,948,961,965,980,987,991,1015,1029,1049,1053,1073,1077,1081,1084,1104,1108,1123,1127,1146,1150,1158,1162,1172,1181,1185,1199,1203,1206,1231,1235,1265,1271,1275,1278,1307,1313,1317,1321,1328,1348,1352,1372,1376,1390,1403,1411,1419,1439,1443,1446,1450,1454,1468,1475,1491,1495,1512,1516,1551,1555,1575,1581,1589,1599,1612,1629,1632,1636,1728,1732,1757,1764,1773,1798,1802,1826,1833,1839,1843,1856,1860,1867,1876,1882,1886,1908,1912,1919,1928,1931,1942,1960,1964,1979,1982,1989],[427,428,430],"h2",{"id":429},"a-net-net-core-net-framework","A. .NET \u002F .NET Core \u002F .NET Framework",[432,433,435],"h3",{"id":434},"_1-net-net-core-net-framework-khác-gì","1. .NET, .NET Core, .NET Framework — khác gì?",[437,438,439,447,453],"ul",{},[440,441,442,446],"li",{},[443,444,445],"strong",{},".NET Framework",": bản gốc 2002, chỉ Windows, đã không có version mới (cuối cùng 4.8).",[440,448,449,452],{},[443,450,451],{},".NET Core",": cross-platform, mã nguồn mở, hiệu năng cao (3.1 LTS, 2020).",[440,454,455,458,459,462],{},[443,456,457],{},".NET 5+",": thống nhất, gọi là \"",[443,460,461],{},".NET","\" (5, 6, 7, 8, 9, 10…). Bản chất là .NET Core.",[464,465,466,467,470,471,474],"p",{},"LTS hiện nay: ",[443,468,469],{},".NET 8"," (Nov 2023), ",[443,472,473],{},".NET 10"," (Nov 2025).",[432,476,478],{"id":477},"_2-clr-là-gì","2. CLR là gì?",[464,480,481],{},"Common Language Runtime — virtual machine của .NET. Chịu trách nhiệm:",[437,483,484,487,490,493],{},[440,485,486],{},"JIT compile IL → machine code.",[440,488,489],{},"Garbage Collection.",[440,491,492],{},"Type safety, exception handling.",[440,494,495],{},"Security.",[432,497,499],{"id":498},"_3-il-intermediate-language-managed-code","3. IL (Intermediate Language) \u002F Managed Code?",[437,501,502,505,508,511],{},[440,503,504],{},"Code C# → compiler tạo IL (bytecode).",[440,506,507],{},"IL nằm trong file .dll \u002F .exe.",[440,509,510],{},"Runtime CLR JIT-compile IL → native machine code.",[440,512,513,514,517],{},"Code chạy qua CLR gọi là ",[443,515,516],{},"managed",".",[432,519,521],{"id":520},"_4-cts-cls-là-gì","4. CTS, CLS là gì?",[437,523,524,530],{},[440,525,526,529],{},[443,527,528],{},"CTS"," (Common Type System): tập kiểu chung mọi ngôn ngữ .NET dùng.",[440,531,532,535],{},[443,533,534],{},"CLS"," (Common Language Specification): subset của CTS bảo đảm interop giữa các ngôn ngữ.",[432,537,539],{"id":538},"_5-nuget-là-gì","5. NuGet là gì?",[464,541,542,543,547],{},"Package manager cho .NET — install\u002Frestore library. ",[544,545,546],"code",{},"dotnet add package \u003Cname>"," hoặc Visual Studio Package Manager.",[427,549,551],{"id":550},"b-aspnet-core-cơ-bản","B. ASP.NET Core cơ bản",[432,553,555],{"id":554},"_6-aspnet-core-có-gì-khác-aspnet-cũ","6. ASP.NET Core có gì khác ASP.NET (cũ)?",[437,557,558,561,564,567,570,573],{},[440,559,560],{},"Cross-platform (Windows, Linux, macOS).",[440,562,563],{},"Self-hosted (Kestrel), không cần IIS.",[440,565,566],{},"DI built-in.",[440,568,569],{},"Middleware pipeline thay vì HTTP Module\u002FHandler.",[440,571,572],{},"Cấu hình bằng JSON\u002Fenv, không web.config.",[440,574,575],{},"Modular qua NuGet.",[432,577,579],{"id":578},"_7-kestrel-là-gì","7. Kestrel là gì?",[464,581,582],{},"Web server cross-platform built-in của ASP.NET Core. Có thể chạy trực tiếp (production-grade) hoặc đứng sau reverse proxy (Nginx, IIS).",[432,584,586],{"id":585},"_8-cấu-trúc-programcs-net-89","8. Cấu trúc Program.cs (.NET 8\u002F9)?",[588,589,594],"pre",{"className":590,"code":591,"language":592,"meta":593,"style":593},"language-csharp shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","var builder = WebApplication.CreateBuilder(args);\n\u002F\u002F Đăng ký service (DI)\nbuilder.Services.AddControllers();\nvar app = builder.Build();\n\u002F\u002F Middleware pipeline\napp.UseAuthentication();\napp.UseAuthorization();\napp.MapControllers();\napp.Run();\n","csharp","",[544,595,596,604,610,616,622,628,634,640,646],{"__ignoreMap":593},[597,598,601],"span",{"class":599,"line":600},"line",1,[597,602,603],{},"var builder = WebApplication.CreateBuilder(args);\n",[597,605,607],{"class":599,"line":606},2,[597,608,609],{},"\u002F\u002F Đăng ký service (DI)\n",[597,611,613],{"class":599,"line":612},3,[597,614,615],{},"builder.Services.AddControllers();\n",[597,617,619],{"class":599,"line":618},4,[597,620,621],{},"var app = builder.Build();\n",[597,623,625],{"class":599,"line":624},5,[597,626,627],{},"\u002F\u002F Middleware pipeline\n",[597,629,631],{"class":599,"line":630},6,[597,632,633],{},"app.UseAuthentication();\n",[597,635,637],{"class":599,"line":636},7,[597,638,639],{},"app.UseAuthorization();\n",[597,641,643],{"class":599,"line":642},8,[597,644,645],{},"app.MapControllers();\n",[597,647,649],{"class":599,"line":648},9,[597,650,651],{},"app.Run();\n",[464,653,654,655,658,659,517],{},".NET 6+ dùng ",[443,656,657],{},"minimal hosting"," — không cần ",[544,660,661],{},"Startup.cs",[432,663,665,666,669],{"id":664},"_9-appsettingsjson-hoạt-động-ra-sao","9. ",[544,667,668],{},"appsettings.json"," hoạt động ra sao?",[464,671,672],{},"File config JSON, được load theo thứ tự:",[674,675,676,680,686,689,692],"ol",{},[440,677,678],{},[544,679,668],{},[440,681,682,685],{},[544,683,684],{},"appsettings.{Environment}.json"," (Development\u002FProduction)",[440,687,688],{},"User secrets (Dev)",[440,690,691],{},"Environment variables",[440,693,694],{},"Command-line args",[464,696,697,698,701,702,517],{},"Mỗi nguồn ghi đè nguồn trước. Truy cập qua ",[544,699,700],{},"IConfiguration"," hoặc ",[544,703,704],{},"IOptions\u003CT>",[432,706,708,709,711,712,711,715,718],{"id":707},"_10-sự-khác-giữa-ioptionst-ioptionssnapshott-ioptionsmonitort","10. Sự khác giữa ",[544,710,704],{},", ",[544,713,714],{},"IOptionsSnapshot\u003CT>",[544,716,717],{},"IOptionsMonitor\u003CT>","?",[437,720,721,726,731],{},[440,722,723,725],{},[544,724,704],{},": load 1 lần khi register, không refresh.",[440,727,728,730],{},[544,729,714],{},": refresh mỗi request (Scoped).",[440,732,733,735],{},[544,734,717],{},": refresh real-time + có event change.",[427,737,739],{"id":738},"c-middleware","C. Middleware",[432,741,743],{"id":742},"_11-middleware-là-gì","11. Middleware là gì?",[464,745,746,747,750],{},"Component xử lý HTTP request trong pipeline. Có thể inspect, modify, short-circuit (không gọi ",[544,748,749],{},"next",").",[432,752,754],{"id":753},"_12-thứ-tự-middleware-quan-trọng-ra-sao","12. Thứ tự middleware quan trọng ra sao?",[464,756,757],{},"Cực kỳ. Pipeline order:",[588,759,764],{"className":760,"code":762,"language":763},[761],"language-text","UseExceptionHandler \u002F DeveloperExceptionPage\nUseHttpsRedirection\nUseStaticFiles\nUseRouting\nUseCors\nUseAuthentication\nUseAuthorization\nUseEndpoints \u002F MapControllers\n","text",[544,765,762],{"__ignoreMap":593},[432,767,769,770,773,774,773,777,718],{"id":768},"_13-appuse-vs-apprun-vs-appmap","13. ",[544,771,772],{},"app.Use"," vs ",[544,775,776],{},"app.Run",[544,778,779],{},"app.Map",[437,781,782,791,797],{},[440,783,784,787,788,790],{},[544,785,786],{},"Use",": middleware có ",[544,789,749],{}," — chuyển control xuống.",[440,792,793,796],{},[544,794,795],{},"Run",": terminal middleware, không gọi tiếp.",[440,798,799,802],{},[544,800,801],{},"Map",": branch pipeline theo path.",[432,804,806],{"id":805},"_14-viết-custom-middleware","14. Viết custom middleware?",[588,808,810],{"className":590,"code":809,"language":592,"meta":593,"style":593},"public class TimingMiddleware {\n    private readonly RequestDelegate _next;\n    public TimingMiddleware(RequestDelegate next) => _next = next;\n    public async Task InvokeAsync(HttpContext ctx) {\n        var sw = Stopwatch.StartNew();\n        await _next(ctx);\n        Console.WriteLine($\"{ctx.Request.Path} took {sw.ElapsedMilliseconds}ms\");\n    }\n}\n\u002F\u002F Đăng ký:\napp.UseMiddleware\u003CTimingMiddleware>();\n",[544,811,812,817,822,827,832,837,842,847,852,857,863],{"__ignoreMap":593},[597,813,814],{"class":599,"line":600},[597,815,816],{},"public class TimingMiddleware {\n",[597,818,819],{"class":599,"line":606},[597,820,821],{},"    private readonly RequestDelegate _next;\n",[597,823,824],{"class":599,"line":612},[597,825,826],{},"    public TimingMiddleware(RequestDelegate next) => _next = next;\n",[597,828,829],{"class":599,"line":618},[597,830,831],{},"    public async Task InvokeAsync(HttpContext ctx) {\n",[597,833,834],{"class":599,"line":624},[597,835,836],{},"        var sw = Stopwatch.StartNew();\n",[597,838,839],{"class":599,"line":630},[597,840,841],{},"        await _next(ctx);\n",[597,843,844],{"class":599,"line":636},[597,845,846],{},"        Console.WriteLine($\"{ctx.Request.Path} took {sw.ElapsedMilliseconds}ms\");\n",[597,848,849],{"class":599,"line":642},[597,850,851],{},"    }\n",[597,853,854],{"class":599,"line":648},[597,855,856],{},"}\n",[597,858,860],{"class":599,"line":859},10,[597,861,862],{},"\u002F\u002F Đăng ký:\n",[597,864,866],{"class":599,"line":865},11,[597,867,868],{},"app.UseMiddleware\u003CTimingMiddleware>();\n",[432,870,872],{"id":871},"_15-global-exception-handler-thực-hiện-sao","15. Global Exception Handler thực hiện sao?",[464,874,875],{},"Middleware bao try-catch ở đầu pipeline → trả JSON 500 nếu lỗi:",[588,877,879],{"className":590,"code":878,"language":592,"meta":593,"style":593},"app.UseExceptionHandler(builder => builder.Run(async ctx => {\n    ctx.Response.StatusCode = 500;\n    var ex = ctx.Features.Get\u003CIExceptionHandlerFeature>()?.Error;\n    await ctx.Response.WriteAsJsonAsync(new { error = ex?.Message });\n}));\n",[544,880,881,886,891,896,901],{"__ignoreMap":593},[597,882,883],{"class":599,"line":600},[597,884,885],{},"app.UseExceptionHandler(builder => builder.Run(async ctx => {\n",[597,887,888],{"class":599,"line":606},[597,889,890],{},"    ctx.Response.StatusCode = 500;\n",[597,892,893],{"class":599,"line":612},[597,894,895],{},"    var ex = ctx.Features.Get\u003CIExceptionHandlerFeature>()?.Error;\n",[597,897,898],{"class":599,"line":618},[597,899,900],{},"    await ctx.Response.WriteAsJsonAsync(new { error = ex?.Message });\n",[597,902,903],{"class":599,"line":624},[597,904,905],{},"}));\n",[427,907,909],{"id":908},"d-dependency-injection","D. Dependency Injection",[432,911,913],{"id":912},"_16-di-lifetimes-singleton-scoped-transient","16. DI lifetimes — Singleton, Scoped, Transient?",[437,915,916,922,928],{},[440,917,918,921],{},[443,919,920],{},"Singleton",": 1 instance suốt app lifetime.",[440,923,924,927],{},[443,925,926],{},"Scoped",": 1 instance \u002F HTTP request.",[440,929,930,933],{},[443,931,932],{},"Transient",": instance mới mỗi lần inject.",[432,935,937,938,941],{"id":936},"_17-dbcontext-đăng-ký-lifetime-gì-vì-sao","17. ",[544,939,940],{},"DbContext"," đăng ký lifetime gì? Vì sao?",[464,943,944,947],{},[443,945,946],{},"Scoped."," Vì:",[437,949,950,955,958],{},[440,951,952,954],{},[544,953,940],{}," không thread-safe.",[440,956,957],{},"Cần 1 instance \u002F request để Unit of Work hoạt động đúng.",[440,959,960],{},"Phải dispose cuối request.",[432,962,964],{"id":963},"_18-captive-dependency-là-gì","18. Captive dependency là gì?",[464,966,967,968,970,971,973,974,976,977],{},"Inject ",[544,969,926],{}," (hoặc ",[544,972,932],{},") vào ",[544,975,920],{}," → Singleton ôm cố định Scoped đầu tiên, không bao giờ tạo mới. ",[443,978,979],{},"Memory leak + bug logic.",[464,981,982,983,986],{},"Fix: dùng ",[544,984,985],{},"IServiceScopeFactory"," để tự tạo scope khi cần.",[432,988,990],{"id":989},"_19-constructor-injection-vs-method-injection-vs-property-injection","19. Constructor injection vs Method injection vs Property injection?",[437,992,993,999,1009],{},[440,994,995,998],{},[443,996,997],{},"Constructor",": chuẩn nhất — dependency bắt buộc, immutable.",[440,1000,1001,1004,1005,1008],{},[443,1002,1003],{},"Method",": dependency theo lần gọi (",[544,1006,1007],{},"[FromServices]"," trong controller method).",[440,1010,1011,1014],{},[443,1012,1013],{},"Property",": dependency optional. Ít dùng.",[432,1016,1018,1019,773,1022,773,1025,1028],{"id":1017},"_20-addtransient-vs-addscoped-vs-addsingleton-ví-dụ","20. ",[544,1020,1021],{},"AddTransient",[544,1023,1024],{},"AddScoped",[544,1026,1027],{},"AddSingleton"," — ví dụ?",[588,1030,1032],{"className":590,"code":1031,"language":592,"meta":593,"style":593},"services.AddSingleton\u003CICache, MemoryCache>();          \u002F\u002F toàn app\nservices.AddScoped\u003CIUserService, UserService>();       \u002F\u002F mỗi request\nservices.AddTransient\u003CIEmailFormatter, Formatter>();   \u002F\u002F mỗi lần\n",[544,1033,1034,1039,1044],{"__ignoreMap":593},[597,1035,1036],{"class":599,"line":600},[597,1037,1038],{},"services.AddSingleton\u003CICache, MemoryCache>();          \u002F\u002F toàn app\n",[597,1040,1041],{"class":599,"line":606},[597,1042,1043],{},"services.AddScoped\u003CIUserService, UserService>();       \u002F\u002F mỗi request\n",[597,1045,1046],{"class":599,"line":612},[597,1047,1048],{},"services.AddTransient\u003CIEmailFormatter, Formatter>();   \u002F\u002F mỗi lần\n",[432,1050,1052],{"id":1051},"_21-đăng-ký-nhiều-implementation-cho-1-interface","21. Đăng ký nhiều implementation cho 1 interface?",[588,1054,1056],{"className":590,"code":1055,"language":592,"meta":593,"style":593},"services.AddScoped\u003CINotifier, EmailNotifier>();\nservices.AddScoped\u003CINotifier, SmsNotifier>();\n\u002F\u002F Inject IEnumerable\u003CINotifier> → nhận hết\n",[544,1057,1058,1063,1068],{"__ignoreMap":593},[597,1059,1060],{"class":599,"line":600},[597,1061,1062],{},"services.AddScoped\u003CINotifier, EmailNotifier>();\n",[597,1064,1065],{"class":599,"line":606},[597,1066,1067],{},"services.AddScoped\u003CINotifier, SmsNotifier>();\n",[597,1069,1070],{"class":599,"line":612},[597,1071,1072],{},"\u002F\u002F Inject IEnumerable\u003CINotifier> → nhận hết\n",[427,1074,1076],{"id":1075},"e-rest-api","E. REST API",[432,1078,1080],{"id":1079},"_22-rest-là-gì-6-ràng-buộc","22. REST là gì? 6 ràng buộc?",[464,1082,1083],{},"Representational State Transfer:",[674,1085,1086,1089,1092,1095,1098,1101],{},[440,1087,1088],{},"Client-Server",[440,1090,1091],{},"Stateless",[440,1093,1094],{},"Cacheable",[440,1096,1097],{},"Uniform Interface",[440,1099,1100],{},"Layered System",[440,1102,1103],{},"Code on Demand (optional)",[432,1105,1107],{"id":1106},"_23-http-method-nào-idempotent","23. HTTP method nào idempotent?",[437,1109,1110,1113,1116],{},[440,1111,1112],{},"✅ GET, PUT, DELETE, HEAD, OPTIONS.",[440,1114,1115],{},"❌ POST.",[440,1117,1118,1119,1122],{},"PATCH ",[443,1120,1121],{},"không bắt buộc"," — design tốt thường idempotent.",[432,1124,1126],{"id":1125},"_24-post-vs-put-khác-gì","24. POST vs PUT — khác gì?",[437,1128,1129,1139],{},[440,1130,1131,1132,1135,1136,750],{},"POST: tạo mới, không idempotent, server quyết URI (",[544,1133,1134],{},"\u002Fusers"," → tạo ",[544,1137,1138],{},"\u002Fusers\u002F123",[440,1140,1141,1142,1145],{},"PUT: thay thế toàn bộ, idempotent, client biết URI (",[544,1143,1144],{},"PUT \u002Fusers\u002F123"," thay luôn).",[432,1147,1149],{"id":1148},"_25-patch-khác-put","25. PATCH khác PUT?",[437,1151,1152,1155],{},[440,1153,1154],{},"PUT: gửi đầy đủ resource, thay thế.",[440,1156,1157],{},"PATCH: gửi phần thay đổi (delta). Có thể dùng JSON Patch \u002F JSON Merge Patch.",[432,1159,1161],{"id":1160},"_26-trả-status-code-nào-khi-tạo-mới-thành-công","26. Trả status code nào khi tạo mới thành công?",[464,1163,1164,1167,1168,1171],{},[443,1165,1166],{},"201 Created"," + ",[544,1169,1170],{},"Location"," header trỏ tới URI mới + body resource vừa tạo:",[588,1173,1175],{"className":590,"code":1174,"language":592,"meta":593,"style":593},"return CreatedAtAction(nameof(Get), new { id = u.Id }, u);\n",[544,1176,1177],{"__ignoreMap":593},[597,1178,1179],{"class":599,"line":600},[597,1180,1174],{},[432,1182,1184],{"id":1183},"_27-401-vs-403","27. 401 vs 403?",[437,1186,1187,1193],{},[440,1188,1189,1192],{},[443,1190,1191],{},"401 Unauthorized",": chưa auth \u002F token sai \u002F hết hạn.",[440,1194,1195,1198],{},[443,1196,1197],{},"403 Forbidden",": đã auth nhưng không có quyền cho action này.",[432,1200,1202],{"id":1201},"_28-cors-là-gì-bật-ra-sao","28. CORS là gì? Bật ra sao?",[464,1204,1205],{},"Cross-Origin Resource Sharing — browser policy cho phép request cross-domain.",[588,1207,1209],{"className":590,"code":1208,"language":592,"meta":593,"style":593},"builder.Services.AddCors(o => o.AddPolicy(\"default\",\n    p => p.WithOrigins(\"https:\u002F\u002Fapp.com\")\n          .AllowAnyHeader().AllowAnyMethod()));\napp.UseCors(\"default\");\n",[544,1210,1211,1216,1221,1226],{"__ignoreMap":593},[597,1212,1213],{"class":599,"line":600},[597,1214,1215],{},"builder.Services.AddCors(o => o.AddPolicy(\"default\",\n",[597,1217,1218],{"class":599,"line":606},[597,1219,1220],{},"    p => p.WithOrigins(\"https:\u002F\u002Fapp.com\")\n",[597,1222,1223],{"class":599,"line":612},[597,1224,1225],{},"          .AllowAnyHeader().AllowAnyMethod()));\n",[597,1227,1228],{"class":599,"line":618},[597,1229,1230],{},"app.UseCors(\"default\");\n",[432,1232,1234],{"id":1233},"_29-versioning-api-cách-phổ-biến","29. Versioning API — cách phổ biến?",[437,1236,1237,1247,1253,1259],{},[440,1238,1239,1240,711,1243,1246],{},"URI: ",[544,1241,1242],{},"\u002Fapi\u002Fv1\u002Fusers",[544,1244,1245],{},"\u002Fapi\u002Fv2\u002Fusers"," (đơn giản, phổ biến nhất).",[440,1248,1249,1250,517],{},"Header: ",[544,1251,1252],{},"Api-Version: 2",[440,1254,1255,1256,517],{},"Query: ",[544,1257,1258],{},"?version=2",[440,1260,1261,1262,517],{},"Media type: ",[544,1263,1264],{},"Accept: application\u002Fvnd.app.v2+json",[464,1266,1267,1268,517],{},"Package: ",[544,1269,1270],{},"Asp.Versioning.Http",[432,1272,1274],{"id":1273},"_30-model-binding-validation","30. Model binding & validation?",[464,1276,1277],{},"ASP.NET Core tự bind body\u002Fquery\u002Froute vào DTO. Validation qua data annotation:",[588,1279,1281],{"className":590,"code":1280,"language":592,"meta":593,"style":593},"public class CreateUserDto {\n    [Required] public string Name { get; set; } = \"\";\n    [EmailAddress] public string Email { get; set; } = \"\";\n    [Range(18, 120)] public int Age { get; set; }\n}\n",[544,1282,1283,1288,1293,1298,1303],{"__ignoreMap":593},[597,1284,1285],{"class":599,"line":600},[597,1286,1287],{},"public class CreateUserDto {\n",[597,1289,1290],{"class":599,"line":606},[597,1291,1292],{},"    [Required] public string Name { get; set; } = \"\";\n",[597,1294,1295],{"class":599,"line":612},[597,1296,1297],{},"    [EmailAddress] public string Email { get; set; } = \"\";\n",[597,1299,1300],{"class":599,"line":618},[597,1301,1302],{},"    [Range(18, 120)] public int Age { get; set; }\n",[597,1304,1305],{"class":599,"line":624},[597,1306,856],{},[464,1308,1309,1312],{},[544,1310,1311],{},"[ApiController]"," tự trả 400 nếu validation fail.",[427,1314,1316],{"id":1315},"f-jwt-authentication","F. JWT Authentication",[432,1318,1320],{"id":1319},"_31-jwt-là-gì-cấu-trúc","31. JWT là gì? Cấu trúc?",[464,1322,1323,1324,1327],{},"JSON Web Token — chuỗi ",[544,1325,1326],{},"header.payload.signature"," (base64url-encoded).",[437,1329,1330,1336,1342],{},[440,1331,1332,1335],{},[443,1333,1334],{},"Header",": alg, typ.",[440,1337,1338,1341],{},[443,1339,1340],{},"Payload",": claims (sub, exp, role…).",[440,1343,1344,1347],{},[443,1345,1346],{},"Signature",": HMAC\u002FRSA của header+payload.",[432,1349,1351],{"id":1350},"_32-jwt-lưu-ở-đâu-phía-client","32. JWT lưu ở đâu phía client?",[437,1353,1354,1360,1366],{},[440,1355,1356,1359],{},[443,1357,1358],{},"localStorage",": dễ XSS đánh cắp.",[440,1361,1362,1365],{},[443,1363,1364],{},"HttpOnly cookie",": an toàn hơn nhưng cần CSRF protection.",[440,1367,1368,1371],{},[443,1369,1370],{},"Memory + refresh token cookie",": pattern hiện đại.",[432,1373,1375],{"id":1374},"_33-authentication-vs-authorization","33. Authentication vs Authorization?",[437,1377,1378,1384],{},[440,1379,1380,1383],{},[443,1381,1382],{},"Authentication",": bạn là ai? (đăng nhập, verify identity).",[440,1385,1386,1389],{},[443,1387,1388],{},"Authorization",": bạn được làm gì? (role, policy, claim).",[464,1391,1392,1395,1396,1399,1400,517],{},[544,1393,1394],{},"UseAuthentication"," luôn phải đặt ",[443,1397,1398],{},"trước"," ",[544,1401,1402],{},"UseAuthorization",[432,1404,1406,1407,1410],{"id":1405},"_34-authorizeroles-admin-vs-policy","34. ",[544,1408,1409],{},"[Authorize(Roles = \"Admin\")]"," vs Policy?",[437,1412,1413,1416],{},[440,1414,1415],{},"Role: cơ chế cũ, đơn giản.",[440,1417,1418],{},"Policy: flexible, custom requirement (claim, role, dynamic).",[588,1420,1422],{"className":590,"code":1421,"language":592,"meta":593,"style":593},"services.AddAuthorization(o => o.AddPolicy(\"MinAge\", p =>\n    p.RequireClaim(\"age\", \"18\", \"19\", \"20\")));\n[Authorize(Policy = \"MinAge\")]\n",[544,1423,1424,1429,1434],{"__ignoreMap":593},[597,1425,1426],{"class":599,"line":600},[597,1427,1428],{},"services.AddAuthorization(o => o.AddPolicy(\"MinAge\", p =>\n",[597,1430,1431],{"class":599,"line":606},[597,1432,1433],{},"    p.RequireClaim(\"age\", \"18\", \"19\", \"20\")));\n",[597,1435,1436],{"class":599,"line":612},[597,1437,1438],{},"[Authorize(Policy = \"MinAge\")]\n",[432,1440,1442],{"id":1441},"_35-refresh-token-vì-sao-cần","35. Refresh token — vì sao cần?",[464,1444,1445],{},"JWT thường có expiry ngắn (15p–1h). Refresh token (lưu DB, expiry dài) đổi lấy JWT mới mà không cần đăng nhập lại. Revoke được khi user logout.",[427,1447,1449],{"id":1448},"g-ef-core","G. EF Core",[432,1451,1453],{"id":1452},"_36-ef-core-khác-ef6","36. EF Core khác EF6?",[437,1455,1456,1459,1462,1465],{},[440,1457,1458],{},"EF Core: cross-platform, .NET Core\u002F.NET 5+.",[440,1460,1461],{},"Lightweight, hiệu năng tốt hơn.",[440,1463,1464],{},"Hỗ trợ provider mới: SQL Server, PostgreSQL, MySQL, SQLite, In-Memory.",[440,1466,1467],{},"Một số tính năng EF6 đã có: Lazy loading (qua proxy), TPT, Stored Procedure mapping — EF Core dần thêm lại qua version.",[432,1469,1471,1472,1474],{"id":1470},"_37-dbcontext-đại-diện-gì","37. ",[544,1473,940],{}," đại diện gì?",[464,1476,1477,1167,1480,1483,1484,1487,1488,517],{},[443,1478,1479],{},"Unit of Work",[443,1481,1482],{},"Repository facade",". Track entity changes, expose ",[544,1485,1486],{},"DbSet\u003CT>"," query, commit qua ",[544,1489,1490],{},"SaveChanges()",[432,1492,1494],{"id":1493},"_38-code-first-vs-database-first","38. Code-First vs Database-First?",[437,1496,1497,1503],{},[440,1498,1499,1502],{},[443,1500,1501],{},"Code-First",": viết entity C# trước, sinh DB qua migration. Mặc định EF Core.",[440,1504,1505,1508,1509,750],{},[443,1506,1507],{},"Database-First",": DB đã có → scaffold ra entity (",[544,1510,1511],{},"dotnet ef dbcontext scaffold",[432,1513,1515],{"id":1514},"_39-lazy-eager-explicit-loading","39. Lazy \u002F Eager \u002F Explicit loading?",[437,1517,1518,1531,1541],{},[440,1519,1520,1523,1524,1167,1527,1530],{},[443,1521,1522],{},"Lazy",": load khi truy cập property (cần ",[544,1525,1526],{},"UseLazyLoadingProxies",[544,1528,1529],{},"virtual"," navigation).",[440,1532,1533,1536,1537,1540],{},[443,1534,1535],{},"Eager",": dùng ",[544,1538,1539],{},"Include",", JOIN 1 lượt.",[440,1542,1543,1546,1547,1550],{},[443,1544,1545],{},"Explicit",": gọi ",[544,1548,1549],{},"Entry(e).Collection(...).Load()"," chủ động.",[432,1552,1554],{"id":1553},"_40-n1-query-problem-ví-dụ","40. N+1 query problem — ví dụ?",[588,1556,1558],{"className":590,"code":1557,"language":592,"meta":593,"style":593},"var users = _db.Users.ToList();        \u002F\u002F 1 query\nforeach (var u in users)\n    Console.WriteLine(u.Orders.Count); \u002F\u002F N query — mỗi user 1 query (lazy)\n",[544,1559,1560,1565,1570],{"__ignoreMap":593},[597,1561,1562],{"class":599,"line":600},[597,1563,1564],{},"var users = _db.Users.ToList();        \u002F\u002F 1 query\n",[597,1566,1567],{"class":599,"line":606},[597,1568,1569],{},"foreach (var u in users)\n",[597,1571,1572],{"class":599,"line":612},[597,1573,1574],{},"    Console.WriteLine(u.Orders.Count); \u002F\u002F N query — mỗi user 1 query (lazy)\n",[464,1576,1577,1578,517],{},"Fix: ",[544,1579,1580],{},"Include(u => u.Orders)",[432,1582,1584,1585,1588],{"id":1583},"_41-asnotracking-dùng-khi-nào","41. ",[544,1586,1587],{},"AsNoTracking()"," dùng khi nào?",[464,1590,1591,1592,1595,1596,1598],{},"Query ",[443,1593,1594],{},"chỉ đọc"," — không cần track change → nhanh hơn, ít RAM. Không gọi ",[544,1597,1490],{}," được cho entity từ no-tracking.",[432,1600,1602,1603,773,1606,773,1609,718],{"id":1601},"_42-add-vs-attach-vs-update","42. ",[544,1604,1605],{},"Add",[544,1607,1608],{},"Attach",[544,1610,1611],{},"Update",[437,1613,1614,1619,1624],{},[440,1615,1616,1618],{},[544,1617,1605],{},": state = Added → INSERT.",[440,1620,1621,1623],{},[544,1622,1608],{},": state = Unchanged → không UPDATE.",[440,1625,1626,1628],{},[544,1627,1611],{},": state = Modified → UPDATE tất cả cột.",[464,1630,1631],{},"Hiểu state machine để tránh UPDATE thừa cột.",[432,1633,1635],{"id":1634},"_43-migration-workflow-chuẩn","43. Migration — workflow chuẩn?",[588,1637,1641],{"className":1638,"code":1639,"language":1640,"meta":593,"style":593},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","dotnet ef migrations add InitialCreate\ndotnet ef database update\n# Sửa entity → migration mới\ndotnet ef migrations add AddUserAvatar\ndotnet ef database update\n# Sản xuất: sinh script SQL\ndotnet ef migrations script -i -o init.sql\n","bash",[544,1642,1643,1662,1674,1680,1693,1703,1708],{"__ignoreMap":593},[597,1644,1645,1649,1653,1656,1659],{"class":599,"line":600},[597,1646,1648],{"class":1647},"sBMFI","dotnet",[597,1650,1652],{"class":1651},"sfazB"," ef",[597,1654,1655],{"class":1651}," migrations",[597,1657,1658],{"class":1651}," add",[597,1660,1661],{"class":1651}," InitialCreate\n",[597,1663,1664,1666,1668,1671],{"class":599,"line":606},[597,1665,1648],{"class":1647},[597,1667,1652],{"class":1651},[597,1669,1670],{"class":1651}," database",[597,1672,1673],{"class":1651}," update\n",[597,1675,1676],{"class":599,"line":612},[597,1677,1679],{"class":1678},"sHwdD","# Sửa entity → migration mới\n",[597,1681,1682,1684,1686,1688,1690],{"class":599,"line":618},[597,1683,1648],{"class":1647},[597,1685,1652],{"class":1651},[597,1687,1655],{"class":1651},[597,1689,1658],{"class":1651},[597,1691,1692],{"class":1651}," AddUserAvatar\n",[597,1694,1695,1697,1699,1701],{"class":599,"line":624},[597,1696,1648],{"class":1647},[597,1698,1652],{"class":1651},[597,1700,1670],{"class":1651},[597,1702,1673],{"class":1651},[597,1704,1705],{"class":599,"line":630},[597,1706,1707],{"class":1678},"# Sản xuất: sinh script SQL\n",[597,1709,1710,1712,1714,1716,1719,1722,1725],{"class":599,"line":636},[597,1711,1648],{"class":1647},[597,1713,1652],{"class":1651},[597,1715,1655],{"class":1651},[597,1717,1718],{"class":1651}," script",[597,1720,1721],{"class":1651}," -i",[597,1723,1724],{"class":1651}," -o",[597,1726,1727],{"class":1651}," init.sql\n",[432,1729,1731],{"id":1730},"_44-fluent-api-vs-data-annotation","44. Fluent API vs Data Annotation?",[437,1733,1734,1747],{},[440,1735,1736,1739,1740,711,1743,1746],{},[443,1737,1738],{},"Data Annotation",": gắn trên class\u002Fproperty (",[544,1741,1742],{},"[Required]",[544,1744,1745],{},"[MaxLength]","). Đơn giản.",[440,1748,1749,1752,1753,1756],{},[443,1750,1751],{},"Fluent API",": trong ",[544,1754,1755],{},"OnModelCreating"," — mạnh hơn, configurable hơn (composite key, complex index).",[464,1758,1759,1760,1763],{},"Tổ chức tốt: dùng ",[544,1761,1762],{},"IEntityTypeConfiguration\u003CT>"," mỗi entity 1 file.",[432,1765,1767,1768,773,1770,718],{"id":1766},"_45-include-vs-theninclude","45. ",[544,1769,1539],{},[544,1771,1772],{},"ThenInclude",[588,1774,1776],{"className":590,"code":1775,"language":592,"meta":593,"style":593},"_db.Orders\n   .Include(o => o.Customer)              \u002F\u002F navigation cấp 1\n   .Include(o => o.Items)                 \u002F\u002F navigation cấp 1 khác\n   .ThenInclude(i => i.Product);          \u002F\u002F tiếp tục từ Items\n",[544,1777,1778,1783,1788,1793],{"__ignoreMap":593},[597,1779,1780],{"class":599,"line":600},[597,1781,1782],{},"_db.Orders\n",[597,1784,1785],{"class":599,"line":606},[597,1786,1787],{},"   .Include(o => o.Customer)              \u002F\u002F navigation cấp 1\n",[597,1789,1790],{"class":599,"line":612},[597,1791,1792],{},"   .Include(o => o.Items)                 \u002F\u002F navigation cấp 1 khác\n",[597,1794,1795],{"class":599,"line":618},[597,1796,1797],{},"   .ThenInclude(i => i.Product);          \u002F\u002F tiếp tục từ Items\n",[432,1799,1801],{"id":1800},"_46-raw-sql-trong-ef-core","46. Raw SQL trong EF Core?",[437,1803,1804,1809,1815],{},[440,1805,1255,1806,517],{},[544,1807,1808],{},"_db.Users.FromSqlRaw(\"SELECT * FROM Users WHERE Age > {0}\", 18)",[440,1810,1811,1812,517],{},"Update\u002FInsert\u002FDelete: ",[544,1813,1814],{},"_db.Database.ExecuteSqlRaw(\"UPDATE ...\", params)",[440,1816,1817,1818,1821,1822,1825],{},"Phải dùng ",[443,1819,1820],{},"interpolated raw",": ",[544,1823,1824],{},"FromSqlInterpolated($\"SELECT * FROM Users WHERE Id={id}\")"," an toàn SQL injection.",[432,1827,1829,1830,1832],{"id":1828},"_47-savechanges-chạy-bao-nhiêu-transaction","47. ",[544,1831,1490],{}," chạy bao nhiêu transaction?",[464,1834,1835,1838],{},[443,1836,1837],{},"1 transaction",", gom mọi INSERT\u002FUPDATE\u002FDELETE. Nếu 1 cái fail, rollback toàn bộ.",[432,1840,1842],{"id":1841},"_48-ef-core-có-hỗ-trợ-split-query-không","48. EF Core có hỗ trợ split query không?",[464,1844,1845,1848,1849,1852,1853,1855],{},[443,1846,1847],{},"Có"," (.NET 5+). ",[544,1850,1851],{},"AsSplitQuery()"," — sinh nhiều SELECT thay vì 1 JOIN khổng lồ → tránh cartesian explosion khi ",[544,1854,1539],{}," nhiều navigation collection.",[432,1857,1859],{"id":1858},"_49-soft-delete-trong-ef-core","49. Soft delete trong EF Core?",[464,1861,1862,1863,1866],{},"Thêm cột ",[544,1864,1865],{},"IsDeleted bool"," + global query filter:",[588,1868,1870],{"className":590,"code":1869,"language":592,"meta":593,"style":593},"mb.Entity\u003CUser>().HasQueryFilter(u => !u.IsDeleted);\n",[544,1871,1872],{"__ignoreMap":593},[597,1873,1874],{"class":599,"line":600},[597,1875,1869],{},[464,1877,1878,1879,517],{},"Mọi query tự thêm ",[544,1880,1881],{},"WHERE IsDeleted = 0",[432,1883,1885],{"id":1884},"_50-optimistic-vs-pessimistic-concurrency","50. Optimistic vs Pessimistic concurrency?",[437,1887,1888,1894],{},[440,1889,1890,1893],{},[443,1891,1892],{},"Pessimistic",": lock row khi đọc — chặn user khác sửa.",[440,1895,1896,1899,1900,1903,1904,1907],{},[443,1897,1898],{},"Optimistic",": không lock, dùng cột ",[544,1901,1902],{},"RowVersion"," (timestamp). Khi SaveChanges → so version, nếu khác → ",[544,1905,1906],{},"DbUpdateConcurrencyException",". Mặc định EF Core.",[432,1909,1911],{"id":1910},"_51-connection-pooling-trong-ef-core","51. Connection pooling trong EF Core?",[464,1913,1914,1915,1918],{},"ADO.NET tự pool ở mức connection. EF Core thêm ",[544,1916,1917],{},"DbContext pooling",":",[588,1920,1922],{"className":590,"code":1921,"language":592,"meta":593,"style":593},"services.AddDbContextPool\u003CAppDbContext>(opt => opt.UseSqlServer(...));\n",[544,1923,1924],{"__ignoreMap":593},[597,1925,1926],{"class":599,"line":600},[597,1927,1921],{},[464,1929,1930],{},"Giảm cost tạo DbContext mỗi request.",[432,1932,1934,1935,1938,1939,718],{"id":1933},"_52-sự-khác-giữa-find-và-firstordefault","52. Sự khác giữa ",[544,1936,1937],{},"Find"," và ",[544,1940,1941],{},"FirstOrDefault",[437,1943,1944,1954],{},[440,1945,1946,1949,1950,1953],{},[544,1947,1948],{},"Find(id)",": tìm theo PK, ",[443,1951,1952],{},"check change tracker trước"," — nếu đã trong memory, không query DB.",[440,1955,1956,1959],{},[544,1957,1958],{},"FirstOrDefault(...)",": luôn query DB.",[432,1961,1963],{"id":1962},"_53-khi-nào-nên-dùng-dapper-thay-ef-core","53. Khi nào nên dùng Dapper thay EF Core?",[437,1965,1966,1973,1976],{},[440,1967,1968,1969,1972],{},"Cần ",[443,1970,1971],{},"performance tối đa"," cho query phức tạp (analytics, report).",[440,1974,1975],{},"Cần kiểm soát SQL từng dòng.",[440,1977,1978],{},"Project không cần full feature ORM.\nDapper là micro-ORM, chỉ map result → object, không tracking.",[1980,1981],"hr",{},[464,1983,1984,1985],{},"➡️ Tiếp theo: ",[1986,1987,1988],"a",{"href":94},"Ngân hàng câu hỏi DSA + Coding",[1990,1991,1992],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}",{"title":593,"searchDepth":606,"depth":606,"links":1994},[1995,2002,2011,2019,2029,2040,2048],{"id":429,"depth":606,"text":430,"children":1996},[1997,1998,1999,2000,2001],{"id":434,"depth":612,"text":435},{"id":477,"depth":612,"text":478},{"id":498,"depth":612,"text":499},{"id":520,"depth":612,"text":521},{"id":538,"depth":612,"text":539},{"id":550,"depth":606,"text":551,"children":2003},[2004,2005,2006,2007,2009],{"id":554,"depth":612,"text":555},{"id":578,"depth":612,"text":579},{"id":585,"depth":612,"text":586},{"id":664,"depth":612,"text":2008},"9. appsettings.json hoạt động ra sao?",{"id":707,"depth":612,"text":2010},"10. Sự khác giữa IOptions\u003CT>, IOptionsSnapshot\u003CT>, IOptionsMonitor\u003CT>?",{"id":738,"depth":606,"text":739,"children":2012},[2013,2014,2015,2017,2018],{"id":742,"depth":612,"text":743},{"id":753,"depth":612,"text":754},{"id":768,"depth":612,"text":2016},"13. app.Use vs app.Run vs app.Map?",{"id":805,"depth":612,"text":806},{"id":871,"depth":612,"text":872},{"id":908,"depth":606,"text":909,"children":2020},[2021,2022,2024,2025,2026,2028],{"id":912,"depth":612,"text":913},{"id":936,"depth":612,"text":2023},"17. DbContext đăng ký lifetime gì? Vì sao?",{"id":963,"depth":612,"text":964},{"id":989,"depth":612,"text":990},{"id":1017,"depth":612,"text":2027},"20. AddTransient vs AddScoped vs AddSingleton — ví dụ?",{"id":1051,"depth":612,"text":1052},{"id":1075,"depth":606,"text":1076,"children":2030},[2031,2032,2033,2034,2035,2036,2037,2038,2039],{"id":1079,"depth":612,"text":1080},{"id":1106,"depth":612,"text":1107},{"id":1125,"depth":612,"text":1126},{"id":1148,"depth":612,"text":1149},{"id":1160,"depth":612,"text":1161},{"id":1183,"depth":612,"text":1184},{"id":1201,"depth":612,"text":1202},{"id":1233,"depth":612,"text":1234},{"id":1273,"depth":612,"text":1274},{"id":1315,"depth":606,"text":1316,"children":2041},[2042,2043,2044,2045,2047],{"id":1319,"depth":612,"text":1320},{"id":1350,"depth":612,"text":1351},{"id":1374,"depth":612,"text":1375},{"id":1405,"depth":612,"text":2046},"34. [Authorize(Roles = \"Admin\")] vs Policy?",{"id":1441,"depth":612,"text":1442},{"id":1448,"depth":606,"text":1449,"children":2049},[2050,2051,2053,2054,2055,2056,2058,2060,2061,2062,2064,2065,2067,2068,2069,2070,2071,2073],{"id":1452,"depth":612,"text":1453},{"id":1470,"depth":612,"text":2052},"37. DbContext đại diện gì?",{"id":1493,"depth":612,"text":1494},{"id":1514,"depth":612,"text":1515},{"id":1553,"depth":612,"text":1554},{"id":1583,"depth":612,"text":2057},"41. AsNoTracking() dùng khi nào?",{"id":1601,"depth":612,"text":2059},"42. Add vs Attach vs Update?",{"id":1634,"depth":612,"text":1635},{"id":1730,"depth":612,"text":1731},{"id":1766,"depth":612,"text":2063},"45. Include vs ThenInclude?",{"id":1800,"depth":612,"text":1801},{"id":1828,"depth":612,"text":2066},"47. SaveChanges() chạy bao nhiêu transaction?",{"id":1841,"depth":612,"text":1842},{"id":1858,"depth":612,"text":1859},{"id":1884,"depth":612,"text":1885},{"id":1910,"depth":612,"text":1911},{"id":1933,"depth":612,"text":2072},"52. Sự khác giữa Find và FirstOrDefault?",{"id":1962,"depth":612,"text":1963},"50+ câu hỏi ASP.NET Core, Web API, Middleware, DI, EF Core, JWT cho fresher\u002Fjunior .NET.","md",null,{},{"title":88,"icon":91},{"title":422,"description":2074},"Ld_vccTfRx20nLulaBEd2IqBI6EWNegIJI4m-K4ZDsA",[2082,2084],{"title":83,"path":84,"stem":85,"description":2083,"icon":86,"children":-1},"40+ câu hỏi SQL\u002FSQL Server fresher .NET hay gặp — JOIN, INDEX, normalization, transaction, query thực tế.",{"title":93,"path":94,"stem":95,"description":2085,"icon":96,"children":-1},"30+ bài coding interview hay gặp với fresher .NET — giải bằng C#, kèm Big O và follow-up.",1783490354957]