[{"data":1,"prerenderedAt":1378},["ShallowReactive",2],{"docs-navigation":3,"doc-\u002Fdev\u002Fcsharp\u002Fclasses-and-models":229,"surround-\u002Fdev\u002Fcsharp\u002Fclasses-and-models":1176,"notes-index":1181},[4,88,171,182,192,203,218],{"title":5,"path":6,"stem":7,"children":8},"Dev","\u002Fdev","1.dev",[9,12,26,36,50,56,78],{"title":10,"path":6,"stem":11},"Development","1.dev\u002Findex",{"title":13,"path":14,"stem":15,"children":16},"Laravel","\u002Fdev\u002Flaravel","1.dev\u002F1.laravel\u002Findex",[17,18,22],{"title":13,"path":14,"stem":15},{"title":19,"path":20,"stem":21},"Eloquent Relationships","\u002Fdev\u002Flaravel\u002Feloquent-relationships","1.dev\u002F1.laravel\u002F1.eloquent-relationships",{"title":23,"path":24,"stem":25},"Laravel Homestead","\u002Fdev\u002Flaravel\u002Flaravel-homestead","1.dev\u002F1.laravel\u002F2.laravel-homestead",{"title":27,"path":28,"stem":29,"children":30},"Bash","\u002Fdev\u002Fbash","1.dev\u002F13.bash\u002Findex",[31,32],{"title":27,"path":28,"stem":29},{"title":33,"path":34,"stem":35},"My Bash RC","\u002Fdev\u002Fbash\u002Fbash-rc","1.dev\u002F13.bash\u002F2.bash-rc",{"title":37,"path":38,"stem":39,"children":40},"Clean Code","\u002Fdev\u002Fclean-code","1.dev\u002F15.clean-code\u002Findex",[41,42,46],{"title":37,"path":38,"stem":39},{"title":43,"path":44,"stem":45},"Naming Things","\u002Fdev\u002Fclean-code\u002Fnaming-things","1.dev\u002F15.clean-code\u002F1.naming-things",{"title":47,"path":48,"stem":49},"Services Return, Callers Present","\u002Fdev\u002Fclean-code\u002Fservices-return-callers-present","1.dev\u002F15.clean-code\u002F2.services-return-callers-present",{"title":51,"path":52,"stem":53,"children":54},"AI Prompting","\u002Fdev\u002Fai-prompting","1.dev\u002F17.ai-prompting\u002Findex",[55],{"title":51,"path":52,"stem":53},{"title":57,"path":58,"stem":59,"children":60},"C#","\u002Fdev\u002Fcsharp","1.dev\u002F2.csharp\u002Findex",[61,62,66,70,74],{"title":57,"path":58,"stem":59},{"title":63,"path":64,"stem":65},"C# Basics","\u002Fdev\u002Fcsharp\u002Fcsharp-basics","1.dev\u002F2.csharp\u002F1.csharp-basics",{"title":67,"path":68,"stem":69},"Classes & Models","\u002Fdev\u002Fcsharp\u002Fclasses-and-models","1.dev\u002F2.csharp\u002F2.classes-and-models",{"title":71,"path":72,"stem":73},"Services & Helpers","\u002Fdev\u002Fcsharp\u002Fservices-and-helpers","1.dev\u002F2.csharp\u002F3.services-and-helpers",{"title":75,"path":76,"stem":77},"Project Structure","\u002Fdev\u002Fcsharp\u002Fproject-structure","1.dev\u002F2.csharp\u002F4.project-structure",{"title":79,"path":80,"stem":81,"children":82},"Git","\u002Fdev\u002Fgit","1.dev\u002F9.git\u002Findex",[83,84],{"title":79,"path":80,"stem":81},{"title":85,"path":86,"stem":87},"Git Cheat Sheet","\u002Fdev\u002Fgit\u002Fgit-cheat-sheet","1.dev\u002F9.git\u002F1.git-cheat-sheet",{"title":89,"path":90,"stem":91,"children":92},"Teaching","\u002Fteaching","2.teaching",[93,95],{"title":89,"path":90,"stem":94},"2.teaching\u002Findex",{"title":96,"path":97,"stem":98,"children":99},"AppsDev","\u002Fteaching\u002Fapps-dev","2.teaching\u002F1.apps-dev\u002Findex",[100,101,119,137,147,161],{"title":96,"path":97,"stem":98},{"title":102,"path":103,"stem":104,"children":105},"Lesson Plans","\u002Fteaching\u002Fapps-dev\u002Flesson-plans","2.teaching\u002F1.apps-dev\u002F1.lesson-plans\u002Findex",[106,107,111,115],{"title":102,"path":103,"stem":104},{"title":108,"path":109,"stem":110},"Coding with AI","\u002Fteaching\u002Fapps-dev\u002Flesson-plans\u002Fcoding-with-ai","2.teaching\u002F1.apps-dev\u002F1.lesson-plans\u002F1.coding-with-ai",{"title":112,"path":113,"stem":114},"Coding with AI: Prompts & Reading JavaScript","\u002Fteaching\u002Fapps-dev\u002Flesson-plans\u002Fprompts-and-reading-js","2.teaching\u002F1.apps-dev\u002F1.lesson-plans\u002F2.prompts-and-reading-js",{"title":116,"path":117,"stem":118},"JavaScript for Beginners","\u002Fteaching\u002Fapps-dev\u002Flesson-plans\u002Fjavascript-for-beginners","2.teaching\u002F1.apps-dev\u002F1.lesson-plans\u002F3.javascript-for-beginners",{"title":120,"path":121,"stem":122,"children":123},"Activities","\u002Fteaching\u002Fapps-dev\u002Factivities","2.teaching\u002F1.apps-dev\u002F2.activities\u002Findex",[124,125,129,133],{"title":120,"path":121,"stem":122},{"title":126,"path":127,"stem":128},"Dynamic Portfolio Website","\u002Fteaching\u002Fapps-dev\u002Factivities\u002Fdynamic-portfolio-website","2.teaching\u002F1.apps-dev\u002F2.activities\u002F2.dynamic-portfolio-website",{"title":130,"path":131,"stem":132},"Mini Product Store","\u002Fteaching\u002Fapps-dev\u002Factivities\u002Fmini-product-store","2.teaching\u002F1.apps-dev\u002F2.activities\u002F3.mini-product-store",{"title":134,"path":135,"stem":136},"Semester Project","\u002Fteaching\u002Fapps-dev\u002Factivities\u002Fsemester-project","2.teaching\u002F1.apps-dev\u002F2.activities\u002F4.semester-project",{"title":138,"path":139,"stem":140,"children":141},"Exercises","\u002Fteaching\u002Fapps-dev\u002Fexercises","2.teaching\u002F1.apps-dev\u002F4.exercises\u002Findex",[142,143],{"title":138,"path":139,"stem":140},{"title":144,"path":145,"stem":146},"Read & Predict","\u002Fteaching\u002Fapps-dev\u002Fexercises\u002Fread-and-predict","2.teaching\u002F1.apps-dev\u002F4.exercises\u002F1.read-and-predict",{"title":148,"path":149,"stem":150,"children":151},"AI Prompts","\u002Fteaching\u002Fapps-dev\u002Fai-prompts","2.teaching\u002F1.apps-dev\u002F7.ai-prompts\u002Findex",[152,153,157],{"title":148,"path":149,"stem":150},{"title":154,"path":155,"stem":156},"Prompt Flow","\u002Fteaching\u002Fapps-dev\u002Fai-prompts\u002Fbasic-prompting","2.teaching\u002F1.apps-dev\u002F7.ai-prompts\u002F1.basic-prompting",{"title":158,"path":159,"stem":160},"Using OpenCode CLI Instead of Copy-Pasting from ChatGPT","\u002Fteaching\u002Fapps-dev\u002Fai-prompts\u002Fopencode-cli","2.teaching\u002F1.apps-dev\u002F7.ai-prompts\u002F2.opencode-cli",{"title":162,"path":163,"stem":164,"children":165},"Cheat Sheets","\u002Fteaching\u002Fapps-dev\u002Fcheat-sheets","2.teaching\u002F1.apps-dev\u002F8.cheat-sheets\u002Findex",[166,167],{"title":162,"path":163,"stem":164},{"title":168,"path":169,"stem":170},"How to Collaborate on GitHub","\u002Fteaching\u002Fapps-dev\u002Fcheat-sheets\u002Fgithub-collaboration","2.teaching\u002F1.apps-dev\u002F8.cheat-sheets\u002F1.github-collaboration",{"title":172,"path":173,"stem":174,"children":175},"Snippets","\u002Fsnippets","3.snippets",[176,178],{"title":172,"path":173,"stem":177},"3.snippets\u002Findex",{"title":179,"path":180,"stem":181},"Debounce and Throttle","\u002Fsnippets\u002Fdebounce-and-throttle","3.snippets\u002F1.debounce-and-throttle",{"title":162,"path":183,"stem":184,"children":185},"\u002Fcheat-sheets","4.cheat-sheets",[186,188],{"title":162,"path":183,"stem":187},"4.cheat-sheets\u002Findex",{"title":189,"path":190,"stem":191},"Vim Cheat Sheet","\u002Fcheat-sheets\u002Fvim-cheat-sheet","4.cheat-sheets\u002F1.vim-cheat-sheet",{"title":193,"path":194,"stem":195,"children":196},"Templates","\u002Ftemplates","5.templates",[197,199],{"title":193,"path":194,"stem":198},"5.templates\u002Findex",{"title":200,"path":201,"stem":202},"Pull Request Template","\u002Ftemplates\u002Fpull-request-template","5.templates\u002F1.pull-request-template",{"title":204,"path":205,"stem":206,"children":207},"Meta","\u002Fmeta","6.meta",[208,210,214],{"title":204,"path":205,"stem":209},"6.meta\u002Findex",{"title":211,"path":212,"stem":213},"Authoring Guide","\u002Fmeta\u002Fauthoring-guide","6.meta\u002F1.authoring-guide",{"title":215,"path":216,"stem":217},"Markdown Showcase","\u002Fmeta\u002Fmarkdown-showcase","6.meta\u002F2.markdown-showcase",{"title":219,"path":220,"stem":221,"children":222},"Troubleshooting","\u002Ftroubleshooting","7.troubleshooting",[223,225],{"title":219,"path":220,"stem":224},"7.troubleshooting\u002Findex",{"title":226,"path":227,"stem":228},"Fixing CORS Errors","\u002Ftroubleshooting\u002Fcors-errors","7.troubleshooting\u002F1.cors-errors",{"id":230,"title":67,"body":231,"category":1156,"createdAt":1157,"description":1158,"draft":1159,"extension":1160,"featured":1159,"keywords":1161,"links":1168,"meta":1169,"navigation":311,"path":68,"readingTime":315,"seo":1170,"stem":69,"tags":1171,"updatedAt":1157,"__hash__":1175},"docs\u002F1.dev\u002F2.csharp\u002F2.classes-and-models.md",{"type":232,"value":233,"toc":1148},"minimark",[234,253,258,273,469,489,493,500,633,637,653,847,851,854,975,1034,1052,1056,1135,1139,1144],[235,236,237,238,242,243,247,248,252],"p",{},"A \"model\" in C# is just a ",[239,240,241],"strong",{},"class"," that holds data. There's no base ",[244,245,246],"code",{},"Model"," to\nextend and no database magic (that's EF Core's job later) — a plain class ",[249,250,251],"em",{},"is","\nyour model.",[254,255,257],"h2",{"id":256},"create-a-model","Create a model",[235,259,260,261,264,265,268,269,272],{},"Each class usually lives in its ",[239,262,263],{},"own file"," named after the class. A ",[244,266,267],{},"User","\nmodel goes in ",[244,270,271],{},"User.cs",":",[274,275,281],"pre",{"className":276,"code":277,"filename":278,"language":279,"meta":280,"style":280},"language-csharp shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","namespace MyApp.Models;\n\npublic class User\n{\n    \u002F\u002F Properties — these are the \"columns\". Note the { get; set; }\n    public int Id { get; set; }\n    public string Username { get; set; } = \"\";\n    public string Password { get; set; } = \"\";\n    public bool IsActive { get; set; } = true;\n}\n","Models\u002FUser.cs","csharp","",[244,282,283,306,313,327,333,340,371,404,432,463],{"__ignoreMap":280},[284,285,288,292,296,300,303],"span",{"class":286,"line":287},"line",1,[284,289,291],{"class":290},"s23sZ","namespace",[284,293,295],{"class":294},"sbc-P"," MyApp",[284,297,299],{"class":298},"soVBu",".",[284,301,302],{"class":294},"Models",[284,304,305],{"class":298},";\n",[284,307,309],{"class":286,"line":308},2,[284,310,312],{"emptyLinePlaceholder":311},true,"\n",[284,314,316,320,323],{"class":286,"line":315},3,[284,317,319],{"class":318},"s5Kfy","public",[284,321,322],{"class":290}," class",[284,324,326],{"class":325},"sD-vU"," User\n",[284,328,330],{"class":286,"line":329},4,[284,331,332],{"class":298},"{\n",[284,334,336],{"class":286,"line":335},5,[284,337,339],{"class":338},"s9Tkl","    \u002F\u002F Properties — these are the \"columns\". Note the { get; set; }\n",[284,341,343,346,350,354,357,360,363,366,368],{"class":286,"line":342},6,[284,344,345],{"class":318},"    public",[284,347,349],{"class":348},"s8XtY"," int",[284,351,353],{"class":352},"sYn-s"," Id",[284,355,356],{"class":298}," {",[284,358,359],{"class":290}," get",[284,361,362],{"class":298},";",[284,364,365],{"class":290}," set",[284,367,362],{"class":298},[284,369,370],{"class":298}," }\n",[284,372,374,376,379,382,384,386,388,390,392,395,398,402],{"class":286,"line":373},7,[284,375,345],{"class":318},[284,377,378],{"class":348}," string",[284,380,381],{"class":352}," Username",[284,383,356],{"class":298},[284,385,359],{"class":290},[284,387,362],{"class":298},[284,389,365],{"class":290},[284,391,362],{"class":298},[284,393,394],{"class":298}," }",[284,396,397],{"class":298}," =",[284,399,401],{"class":400},"sbYkP"," \"\"",[284,403,305],{"class":298},[284,405,407,409,411,414,416,418,420,422,424,426,428,430],{"class":286,"line":406},8,[284,408,345],{"class":318},[284,410,378],{"class":348},[284,412,413],{"class":352}," Password",[284,415,356],{"class":298},[284,417,359],{"class":290},[284,419,362],{"class":298},[284,421,365],{"class":290},[284,423,362],{"class":298},[284,425,394],{"class":298},[284,427,397],{"class":298},[284,429,401],{"class":400},[284,431,305],{"class":298},[284,433,435,437,440,443,445,447,449,451,453,455,457,461],{"class":286,"line":434},9,[284,436,345],{"class":318},[284,438,439],{"class":348}," bool",[284,441,442],{"class":352}," IsActive",[284,444,356],{"class":298},[284,446,359],{"class":290},[284,448,362],{"class":298},[284,450,365],{"class":290},[284,452,362],{"class":298},[284,454,394],{"class":298},[284,456,397],{"class":298},[284,458,460],{"class":459},"sq3J1"," true",[284,462,305],{"class":298},[284,464,466],{"class":286,"line":465},10,[284,467,468],{"class":298},"}\n",[470,471,472],"note",{},[235,473,474,477,478,481,482,485,486,299],{},[244,475,476],{},"{ get; set; }"," is an ",[239,479,480],{},"auto-property"," — C#'s way of declaring a readable and\nwritable field. It's the equivalent of a public property in a Laravel model,\nbut explicit. ",[244,483,484],{},"= \"\""," gives it a default so it doesn't start as ",[244,487,488],{},"null",[254,490,492],{"id":491},"constructors","Constructors",[235,494,495,496,499],{},"A constructor runs when you create the object — same role as PHP's\n",[244,497,498],{},"__construct",". Use it to require values up front:",[274,501,503],{"className":276,"code":502,"filename":278,"language":279,"meta":280,"style":280},"public class User\n{\n    public string Username { get; set; }\n    public string Password { get; set; }\n\n    \u002F\u002F Constructor — same name as the class, no return type\n    public User(string username, string password)\n    {\n        Username = username;\n        Password = password;\n    }\n}\n",[244,504,505,513,517,537,557,561,566,594,599,611,622,628],{"__ignoreMap":280},[284,506,507,509,511],{"class":286,"line":287},[284,508,319],{"class":318},[284,510,322],{"class":290},[284,512,326],{"class":325},[284,514,515],{"class":286,"line":308},[284,516,332],{"class":298},[284,518,519,521,523,525,527,529,531,533,535],{"class":286,"line":315},[284,520,345],{"class":318},[284,522,378],{"class":348},[284,524,381],{"class":352},[284,526,356],{"class":298},[284,528,359],{"class":290},[284,530,362],{"class":298},[284,532,365],{"class":290},[284,534,362],{"class":298},[284,536,370],{"class":298},[284,538,539,541,543,545,547,549,551,553,555],{"class":286,"line":329},[284,540,345],{"class":318},[284,542,378],{"class":348},[284,544,413],{"class":352},[284,546,356],{"class":298},[284,548,359],{"class":290},[284,550,362],{"class":298},[284,552,365],{"class":290},[284,554,362],{"class":298},[284,556,370],{"class":298},[284,558,559],{"class":286,"line":335},[284,560,312],{"emptyLinePlaceholder":311},[284,562,563],{"class":286,"line":342},[284,564,565],{"class":338},"    \u002F\u002F Constructor — same name as the class, no return type\n",[284,567,568,570,574,577,580,583,586,588,591],{"class":286,"line":373},[284,569,345],{"class":318},[284,571,573],{"class":572},"sljsM"," User",[284,575,576],{"class":298},"(",[284,578,579],{"class":348},"string",[284,581,582],{"class":352}," username",[284,584,585],{"class":298},",",[284,587,378],{"class":348},[284,589,590],{"class":352}," password",[284,592,593],{"class":298},")\n",[284,595,596],{"class":286,"line":406},[284,597,598],{"class":298},"    {\n",[284,600,601,605,607,609],{"class":286,"line":434},[284,602,604],{"class":603},"sSC40","        Username",[284,606,397],{"class":298},[284,608,582],{"class":603},[284,610,305],{"class":298},[284,612,613,616,618,620],{"class":286,"line":465},[284,614,615],{"class":603},"        Password",[284,617,397],{"class":298},[284,619,590],{"class":603},[284,621,305],{"class":298},[284,623,625],{"class":286,"line":624},11,[284,626,627],{"class":298},"    }\n",[284,629,631],{"class":286,"line":630},12,[284,632,468],{"class":298},[254,634,636],{"id":635},"use-the-model","Use the model",[235,638,639,640,643,644,647,648,652],{},"You create an object with ",[244,641,642],{},"new",". This is where ",[244,645,646],{},"using"," pulls in the namespace so\nthe type is visible (more on that in ",[649,650,651],"a",{"href":76},"Project structure","):",[274,654,657],{"className":276,"code":655,"filename":656,"language":279,"meta":280,"style":280},"using MyApp.Models;\n\n\u002F\u002F with a constructor\nvar user = new User(\"ada\", \"secret\");\n\n\u002F\u002F or with object-initialiser syntax (no constructor needed)\nvar admin = new User\n{\n    Username = \"admin\",\n    Password = \"hunter2\",\n    IsActive = true\n};\n\nConsole.WriteLine(user.Username);   \u002F\u002F read a property\nuser.IsActive = false;              \u002F\u002F set a property\n","Program.cs",[244,658,659,672,676,681,721,725,730,743,747,764,780,790,795,800,827],{"__ignoreMap":280},[284,660,661,664,666,668,670],{"class":286,"line":287},[284,662,646],{"class":663},"scgAs",[284,665,295],{"class":294},[284,667,299],{"class":298},[284,669,302],{"class":294},[284,671,305],{"class":298},[284,673,674],{"class":286,"line":308},[284,675,312],{"emptyLinePlaceholder":311},[284,677,678],{"class":286,"line":315},[284,679,680],{"class":338},"\u002F\u002F with a constructor\n",[284,682,683,686,689,691,695,697,699,702,706,708,710,713,716,718],{"class":286,"line":329},[284,684,685],{"class":290},"var",[284,687,688],{"class":352}," user",[284,690,397],{"class":298},[284,692,694],{"class":693},"sVsLi"," new",[284,696,573],{"class":325},[284,698,576],{"class":298},[284,700,701],{"class":400},"\"",[284,703,705],{"class":704},"sTbE_","ada",[284,707,701],{"class":400},[284,709,585],{"class":298},[284,711,712],{"class":400}," \"",[284,714,715],{"class":704},"secret",[284,717,701],{"class":400},[284,719,720],{"class":298},");\n",[284,722,723],{"class":286,"line":335},[284,724,312],{"emptyLinePlaceholder":311},[284,726,727],{"class":286,"line":342},[284,728,729],{"class":338},"\u002F\u002F or with object-initialiser syntax (no constructor needed)\n",[284,731,732,734,737,739,741],{"class":286,"line":373},[284,733,685],{"class":290},[284,735,736],{"class":352}," admin",[284,738,397],{"class":298},[284,740,694],{"class":693},[284,742,326],{"class":325},[284,744,745],{"class":286,"line":406},[284,746,332],{"class":298},[284,748,749,752,754,756,759,761],{"class":286,"line":434},[284,750,751],{"class":603},"    Username",[284,753,397],{"class":298},[284,755,712],{"class":400},[284,757,758],{"class":704},"admin",[284,760,701],{"class":400},[284,762,763],{"class":298},",\n",[284,765,766,769,771,773,776,778],{"class":286,"line":465},[284,767,768],{"class":603},"    Password",[284,770,397],{"class":298},[284,772,712],{"class":400},[284,774,775],{"class":704},"hunter2",[284,777,701],{"class":400},[284,779,763],{"class":298},[284,781,782,785,787],{"class":286,"line":624},[284,783,784],{"class":603},"    IsActive",[284,786,397],{"class":298},[284,788,789],{"class":459}," true\n",[284,791,792],{"class":286,"line":630},[284,793,794],{"class":298},"};\n",[284,796,798],{"class":286,"line":797},13,[284,799,312],{"emptyLinePlaceholder":311},[284,801,803,806,808,811,813,816,818,821,824],{"class":286,"line":802},14,[284,804,805],{"class":603},"Console",[284,807,299],{"class":298},[284,809,810],{"class":572},"WriteLine",[284,812,576],{"class":298},[284,814,815],{"class":603},"user",[284,817,299],{"class":298},[284,819,820],{"class":603},"Username",[284,822,823],{"class":298},");",[284,825,826],{"class":338},"   \u002F\u002F read a property\n",[284,828,830,832,834,837,839,842,844],{"class":286,"line":829},15,[284,831,815],{"class":603},[284,833,299],{"class":298},[284,835,836],{"class":603},"IsActive",[284,838,397],{"class":298},[284,840,841],{"class":459}," false",[284,843,362],{"class":298},[284,845,846],{"class":338},"              \u002F\u002F set a property\n",[254,848,850],{"id":849},"methods-on-a-model","Methods on a model",[235,852,853],{},"A model can have behaviour too, not just data:",[274,855,857],{"className":276,"code":856,"filename":278,"language":279,"meta":280,"style":280},"public class User\n{\n    public string Username { get; set; } = \"\";\n    public string Password { get; set; } = \"\";\n\n    public bool CheckPassword(string attempt)\n    {\n        return Password == attempt;   \u002F\u002F (hash this for real — plain text is just for the example)\n    }\n}\n",[244,858,859,867,871,897,923,927,945,949,967,971],{"__ignoreMap":280},[284,860,861,863,865],{"class":286,"line":287},[284,862,319],{"class":318},[284,864,322],{"class":290},[284,866,326],{"class":325},[284,868,869],{"class":286,"line":308},[284,870,332],{"class":298},[284,872,873,875,877,879,881,883,885,887,889,891,893,895],{"class":286,"line":315},[284,874,345],{"class":318},[284,876,378],{"class":348},[284,878,381],{"class":352},[284,880,356],{"class":298},[284,882,359],{"class":290},[284,884,362],{"class":298},[284,886,365],{"class":290},[284,888,362],{"class":298},[284,890,394],{"class":298},[284,892,397],{"class":298},[284,894,401],{"class":400},[284,896,305],{"class":298},[284,898,899,901,903,905,907,909,911,913,915,917,919,921],{"class":286,"line":329},[284,900,345],{"class":318},[284,902,378],{"class":348},[284,904,413],{"class":352},[284,906,356],{"class":298},[284,908,359],{"class":290},[284,910,362],{"class":298},[284,912,365],{"class":290},[284,914,362],{"class":298},[284,916,394],{"class":298},[284,918,397],{"class":298},[284,920,401],{"class":400},[284,922,305],{"class":298},[284,924,925],{"class":286,"line":335},[284,926,312],{"emptyLinePlaceholder":311},[284,928,929,931,933,936,938,940,943],{"class":286,"line":342},[284,930,345],{"class":318},[284,932,439],{"class":348},[284,934,935],{"class":572}," CheckPassword",[284,937,576],{"class":298},[284,939,579],{"class":348},[284,941,942],{"class":352}," attempt",[284,944,593],{"class":298},[284,946,947],{"class":286,"line":373},[284,948,598],{"class":298},[284,950,951,955,957,960,962,964],{"class":286,"line":406},[284,952,954],{"class":953},"siDh9","        return",[284,956,413],{"class":603},[284,958,959],{"class":693}," ==",[284,961,942],{"class":603},[284,963,362],{"class":298},[284,965,966],{"class":338},"   \u002F\u002F (hash this for real — plain text is just for the example)\n",[284,968,969],{"class":286,"line":434},[284,970,627],{"class":298},[284,972,973],{"class":286,"line":465},[284,974,468],{"class":298},[274,976,978],{"className":276,"code":977,"language":279,"meta":280,"style":280},"if (user.CheckPassword(\"secret\"))\n{\n    Console.WriteLine(\"Match\");\n}\n",[244,979,980,1006,1010,1030],{"__ignoreMap":280},[284,981,982,985,988,990,992,995,997,999,1001,1003],{"class":286,"line":287},[284,983,984],{"class":953},"if",[284,986,987],{"class":298}," (",[284,989,815],{"class":603},[284,991,299],{"class":298},[284,993,994],{"class":572},"CheckPassword",[284,996,576],{"class":298},[284,998,701],{"class":400},[284,1000,715],{"class":704},[284,1002,701],{"class":400},[284,1004,1005],{"class":298},"))\n",[284,1007,1008],{"class":286,"line":308},[284,1009,332],{"class":298},[284,1011,1012,1015,1017,1019,1021,1023,1026,1028],{"class":286,"line":315},[284,1013,1014],{"class":603},"    Console",[284,1016,299],{"class":298},[284,1018,810],{"class":572},[284,1020,576],{"class":298},[284,1022,701],{"class":400},[284,1024,1025],{"class":704},"Match",[284,1027,701],{"class":400},[284,1029,720],{"class":298},[284,1031,1032],{"class":286,"line":329},[284,1033,468],{"class":298},[1035,1036,1037],"warning",{},[235,1038,1039,1040,1043,1044,1047,1048,1051],{},"Keep models focused on their own data and behaviour. Logic that spans ",[249,1041,1042],{},"many","\nusers, talks to storage, or coordinates other classes belongs in a ",[239,1045,1046],{},"service",",\nnot on the model — see ",[649,1049,1050],{"href":72},"Services & helpers",".\nThis is the same instinct as keeping Eloquent models thin and pushing workflow\ninto service classes.",[254,1053,1055],{"id":1054},"laravel-c-cheat","Laravel → C# cheat",[1057,1058,1059,1072],"table",{},[1060,1061,1062],"thead",{},[1063,1064,1065,1069],"tr",{},[1066,1067,1068],"th",{},"Laravel model",[1066,1070,1071],{},"C# class",[1073,1074,1075,1089,1101,1113,1123],"tbody",{},[1063,1076,1077,1083],{},[1078,1079,1080],"td",{},[244,1081,1082],{},"class User extends Model",[1078,1084,1085,1088],{},[244,1086,1087],{},"public class User"," (no base needed)",[1063,1090,1091,1096],{},[1078,1092,1093],{},[244,1094,1095],{},"$user->name",[1078,1097,1098],{},[244,1099,1100],{},"user.Name",[1063,1102,1103,1108],{},[1078,1104,1105],{},[244,1106,1107],{},"__construct(...)",[1078,1109,1110],{},[244,1111,1112],{},"public User(...) { }",[1063,1114,1115,1120],{},[1078,1116,1117],{},[244,1118,1119],{},"protected $fillable",[1078,1121,1122],{},"just declare the properties you want",[1063,1124,1125,1130],{},[1078,1126,1127],{},[244,1128,1129],{},"new User(['name' => 'Ada'])",[1078,1131,1132],{},[244,1133,1134],{},"new User { Name = \"Ada\" }",[254,1136,1138],{"id":1137},"next","Next",[235,1140,1141,1142,299],{},"Move shared behaviour off the model and into reusable files → ",[649,1143,1050],{"href":72},[1145,1146,1147],"style",{},"html pre.shiki code .s23sZ, html code.shiki .s23sZ{--shiki-light:#E2931D;--shiki-default:#AB5959;--shiki-dark:#CB7676}html pre.shiki code .sbc-P, html code.shiki .sbc-P{--shiki-light:#90A4AE;--shiki-default:#2E8F82;--shiki-dark:#5DA994}html pre.shiki code .soVBu, html code.shiki .soVBu{--shiki-light:#39ADB5;--shiki-default:#999999;--shiki-dark:#666666}html pre.shiki code .s5Kfy, html code.shiki .s5Kfy{--shiki-light:#9C3EDA;--shiki-default:#AB5959;--shiki-dark:#CB7676}html pre.shiki code .sD-vU, html code.shiki .sD-vU{--shiki-light:#E2931D;--shiki-default:#2E8F82;--shiki-dark:#5DA994}html pre.shiki code .s9Tkl, html code.shiki .s9Tkl{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#A0ADA0;--shiki-default-font-style:inherit;--shiki-dark:#758575DD;--shiki-dark-font-style:inherit}html pre.shiki code .s8XtY, html code.shiki .s8XtY{--shiki-light:#39ADB5;--shiki-default:#1E754F;--shiki-dark:#4D9375}html pre.shiki code .sYn-s, html code.shiki .sYn-s{--shiki-light:#E2931D;--shiki-default:#59873A;--shiki-dark:#80A665}html pre.shiki code .sbYkP, html code.shiki .sbYkP{--shiki-light:#39ADB5;--shiki-default:#B5695977;--shiki-dark:#C98A7D77}html pre.shiki code .sq3J1, html code.shiki .sq3J1{--shiki-light:#FF5370;--shiki-default:#1E754F;--shiki-dark:#4D9375}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 .sljsM, html code.shiki .sljsM{--shiki-light:#6182B8;--shiki-default:#59873A;--shiki-dark:#80A665}html pre.shiki code .sSC40, html code.shiki .sSC40{--shiki-light:#90A4AE;--shiki-default:#B07D48;--shiki-dark:#BD976A}html pre.shiki code .scgAs, html code.shiki .scgAs{--shiki-light:#F76D47;--shiki-default:#1E754F;--shiki-dark:#4D9375}html pre.shiki code .sVsLi, html code.shiki .sVsLi{--shiki-light:#39ADB5;--shiki-default:#AB5959;--shiki-dark:#CB7676}html pre.shiki code .sTbE_, html code.shiki .sTbE_{--shiki-light:#91B859;--shiki-default:#B56959;--shiki-dark:#C98A7D}html pre.shiki code .siDh9, html code.shiki .siDh9{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#1E754F;--shiki-default-font-style:inherit;--shiki-dark:#4D9375;--shiki-dark-font-style:inherit}",{"title":280,"searchDepth":315,"depth":315,"links":1149},[1150,1151,1152,1153,1154,1155],{"id":256,"depth":308,"text":257},{"id":491,"depth":308,"text":492},{"id":635,"depth":308,"text":636},{"id":849,"depth":308,"text":850},{"id":1054,"depth":308,"text":1055},{"id":1137,"depth":308,"text":1138},null,"2026-07-19","Create a class, give it properties and a constructor, and use it — the C# version of a Laravel model.",false,"md",[1162,1163,1164,1165,642,1166,1167],"c# class","c# model","properties","constructor","object","get set",[],{},{"title":67,"description":1158},[279,1172,1173,1174],"dotnet","classes","models","NYNyjqwPwEk2l0TiYipK-ffIr7HxAnYr5NnRD9Di1HM",[1177,1179],{"title":63,"path":64,"stem":65,"description":1178,"children":-1},"Types, variables, control flow and how to write a function (method) in C#, mapped from PHP.",{"title":71,"path":72,"stem":73,"description":1180,"children":-1},"Put code in another file — a service or a static helper — and call it from anywhere, the C# way.",[1182,1192,1199,1202,1210,1217,1221,1223,1225,1228,1231,1239,1245,1248,1254,1257,1263,1266,1269,1274,1277,1280,1286,1290,1295,1298,1304,1308,1311,1316,1319,1322,1325,1328,1330,1336,1339,1344,1347,1351,1354,1361,1366,1369,1375],{"path":135,"title":134,"description":1183,"tags":1184,"category":120,"featured":1159,"updatedAt":1191,"createdAt":1191,"readingTime":630,"draft":1159},"Teams of four build one frontend application over the whole semester using AI, in a single shared GitHub repository where everyone contributes.",[1185,1186,1187,1188,1189,1190],"teaching","activity","capstone","github","ai","frontend","2026-08-01",{"path":169,"title":168,"description":1193,"tags":1194,"category":162,"featured":1159,"updatedAt":1191,"createdAt":1191,"readingTime":329,"draft":1159},"Create one repository, push your project, and add your teammates as collaborators so the whole team can work on the same code.",[1188,1195,1196,1197,1198],"git","collaboration","teamwork","setup",{"path":163,"title":162,"description":1200,"tags":1201,"category":162,"featured":1159,"updatedAt":1191,"createdAt":1191,"readingTime":287,"draft":1159},"Step-by-step references students can follow on their own during class.",[],{"path":159,"title":158,"description":1203,"tags":1204,"category":148,"featured":1159,"updatedAt":1209,"createdAt":1209,"readingTime":315,"draft":1159},"Install and configure the OpenCode CLI so AI writes code directly into your project folder instead of you copying it from a chat window.",[1189,1205,1206,1207,1208],"opencode","cli","tooling","workflow","2026-07-25",{"path":48,"title":47,"description":1211,"tags":1212,"category":37,"featured":1159,"updatedAt":1157,"createdAt":1157,"readingTime":308,"draft":1159},"A service should return a result and let the caller decide how to show it — the single most useful separation-of-concerns rule.",[1213,1214,1215,1216],"clean-code","architecture","separation-of-concerns","services",{"path":64,"title":63,"description":1178,"tags":1218,"category":1156,"featured":1159,"updatedAt":1157,"createdAt":1157,"readingTime":315,"draft":1159},[279,1172,1219,1220],"basics","functions",{"path":68,"title":67,"description":1158,"tags":1222,"category":1156,"featured":1159,"updatedAt":1157,"createdAt":1157,"readingTime":315,"draft":1159},[279,1172,1173,1174],{"path":72,"title":71,"description":1180,"tags":1224,"category":1156,"featured":1159,"updatedAt":1157,"createdAt":1157,"readingTime":315,"draft":1159},[279,1172,1216,1214],{"path":76,"title":75,"description":1226,"tags":1227,"category":1156,"featured":1159,"updatedAt":1157,"createdAt":1157,"readingTime":315,"draft":1159},"How C# files, namespaces, folders and the dotnet CLI fit together into a running app.",[279,1172,1207,1214],{"path":58,"title":57,"description":1229,"tags":1230,"category":1156,"featured":1159,"updatedAt":1157,"createdAt":1157,"readingTime":287,"draft":1159},"Learning C# and .NET from a Laravel\u002FPHP background — the fundamentals, mapped to what you already know.",[279,1172,1219],{"path":20,"title":19,"description":1232,"tags":1233,"category":13,"featured":1159,"updatedAt":1238,"createdAt":1238,"readingTime":287,"draft":1159},"The core Eloquent relationship types with examples and the N+1 trap to avoid.",[1234,1235,1236,1237],"laravel","eloquent","database","orm","2026-07-17",{"path":24,"title":23,"description":1240,"tags":1241,"category":13,"featured":1159,"updatedAt":1238,"createdAt":1238,"readingTime":287,"draft":1159},"My quick reference for setting up and using Laravel Homestead during development.",[1234,1242,1243,1244],"homestead","vagrant","virtualbox",{"path":14,"title":13,"description":1246,"tags":1247,"category":13,"featured":1159,"updatedAt":1238,"createdAt":1238,"readingTime":287,"draft":1159},"The PHP framework for web artisans — Eloquent, routing, queues and more.",[],{"path":34,"title":33,"description":1249,"tags":1250,"category":27,"featured":1159,"updatedAt":1238,"createdAt":1238,"readingTime":308,"draft":1159},"Personal Bash aliases and helper functions that streamline my Laravel and Homestead development workflow.",[1251,1252,1253,1242,1234],"bash","bashrc","git bash",{"path":28,"title":27,"description":1255,"tags":1256,"category":27,"featured":1159,"updatedAt":1238,"createdAt":1238,"readingTime":287,"draft":1159},"Shell scripting and a faster life on the command line.",[],{"path":44,"title":43,"description":1258,"tags":1259,"category":37,"featured":311,"updatedAt":1238,"createdAt":1238,"readingTime":287,"draft":1159},"Practical rules for naming variables, functions and types so code reads like prose.",[1213,1260,1261,1262],"naming","readability","craft",{"path":38,"title":37,"description":1264,"tags":1265,"category":37,"featured":1159,"updatedAt":1238,"createdAt":1238,"readingTime":287,"draft":1159},"Writing code that other people (and future you) can read.",[],{"path":52,"title":51,"description":1267,"tags":1268,"category":51,"featured":1159,"updatedAt":1238,"createdAt":1238,"readingTime":287,"draft":1159},"Getting reliable, useful results out of language models.",[],{"path":86,"title":85,"description":1270,"tags":1271,"category":79,"featured":311,"updatedAt":1238,"createdAt":1238,"readingTime":308,"draft":1159},"The Git commands I actually use day to day, plus how to undo things safely.",[1195,1206,1272,1273],"version-control","cheat-sheet",{"path":80,"title":79,"description":1275,"tags":1276,"category":79,"featured":1159,"updatedAt":1238,"createdAt":1238,"readingTime":287,"draft":1159},"Version control — everyday commands and getting out of trouble.",[],{"path":6,"title":10,"description":1278,"tags":1279,"category":10,"featured":1159,"updatedAt":1238,"createdAt":1238,"readingTime":287,"draft":1159},"Languages, frameworks and the craft of building software.",[],{"path":109,"title":108,"description":1281,"tags":1282,"category":89,"featured":1159,"updatedAt":1238,"createdAt":1238,"readingTime":329,"draft":1159},"An introduction to AI-assisted software development, modern development workflows, and the mindset needed to use AI responsibly throughout the course.",[1189,1283,1284,1285],"software development","prompt engineering","beginners",{"path":113,"title":112,"description":1287,"tags":1288,"category":89,"featured":1159,"updatedAt":1238,"createdAt":1238,"readingTime":329,"draft":1159},"Learn how to write effective AI prompts and read JavaScript code confidently. This lesson teaches students how to direct AI instead of blindly copying its output.",[1189,1289,1284,1285],"javascript",{"path":117,"title":116,"description":1291,"tags":1292,"category":89,"featured":1159,"updatedAt":1238,"createdAt":1238,"readingTime":315,"draft":1159},"Introduction to the fundamentals of JavaScript, from variables and functions to loops, DOM manipulation, and events. This lesson prepares students for the Mini Product Store activity.",[1289,1285,1293,1294],"programming","web development",{"path":103,"title":102,"description":1296,"tags":1297,"category":102,"featured":1159,"updatedAt":1238,"createdAt":1238,"readingTime":287,"draft":1159},"Session-by-session plans with objectives, timing and materials.",[],{"path":127,"title":126,"description":1299,"tags":1300,"category":120,"featured":1159,"updatedAt":1238,"createdAt":1238,"readingTime":315,"draft":1159},"Build a personal portfolio website using JavaScript arrays, loops, and DOM manipulation instead of hardcoded HTML.",[1185,1186,1289,1301,1302,1303],"portfolio","dom","loops",{"path":131,"title":130,"description":1305,"tags":1306,"category":120,"featured":1159,"updatedAt":1238,"createdAt":1238,"readingTime":315,"draft":1159},"A JavaScript activity where students build a simple product store using arrays, loops, functions, DOM manipulation, and event listeners.",[1185,1186,1289,1302,1307,1303],"arrays",{"path":121,"title":120,"description":1309,"tags":1310,"category":120,"featured":1159,"updatedAt":1238,"createdAt":1238,"readingTime":287,"draft":1159},"In-class activities that get students doing, not just listening.",[],{"path":145,"title":144,"description":1312,"tags":1313,"category":120,"featured":1159,"updatedAt":1238,"createdAt":1238,"readingTime":308,"draft":1159},"Practice reading JavaScript code, predicting its output, and verifying your understanding before running the program.",[1185,1186,1289,1220,1314,1315],"if-statement","debugging",{"path":139,"title":138,"description":1317,"tags":1318,"category":138,"featured":1159,"updatedAt":1238,"createdAt":1238,"readingTime":287,"draft":1159},"Practice problems that build skill through repetition.",[],{"path":155,"title":154,"description":1320,"tags":1321,"category":148,"featured":1159,"updatedAt":1238,"createdAt":1238,"readingTime":329,"draft":1159},"A structured workflow for working with AI that emphasizes planning, review, and understanding before implementation.",[1189,1284,1208],{"path":149,"title":148,"description":1323,"tags":1324,"category":148,"featured":1159,"updatedAt":1238,"createdAt":1238,"readingTime":287,"draft":1159},"Prompt templates for teaching with and about AI.",[],{"path":97,"title":96,"description":1326,"tags":1327,"category":89,"featured":1159,"updatedAt":1238,"createdAt":1238,"readingTime":287,"draft":1159},"Lesson plans, activities, rubrics and student references.",[],{"path":90,"title":89,"description":1326,"tags":1329,"category":89,"featured":1159,"updatedAt":1238,"createdAt":1238,"readingTime":287,"draft":1159},[],{"path":180,"title":179,"description":1331,"tags":1332,"category":172,"featured":1159,"updatedAt":1238,"createdAt":1238,"readingTime":287,"draft":1159},"Two tiny functions to control how often a handler runs — with the difference explained.",[1289,1333,1334,1335],"performance","snippets","events",{"path":173,"title":172,"description":1337,"tags":1338,"category":172,"featured":1159,"updatedAt":1238,"createdAt":1238,"readingTime":287,"draft":1159},"Small, copy-ready fragments you reach for again and again.",[],{"path":190,"title":189,"description":1340,"tags":1341,"category":162,"featured":1159,"updatedAt":1238,"createdAt":1238,"readingTime":287,"draft":1159},"The essential Vim motions and commands to get productive and get out.",[1342,1343,1273,1206],"vim","editor",{"path":183,"title":162,"description":1345,"tags":1346,"category":162,"featured":1159,"updatedAt":1238,"createdAt":1238,"readingTime":287,"draft":1159},"Dense, scannable references for commands and syntax.",[],{"path":201,"title":200,"description":1348,"tags":1349,"category":193,"featured":1159,"updatedAt":1238,"createdAt":1238,"readingTime":287,"draft":1159},"A reusable PR description template that makes reviews faster and kinder.",[1195,1188,1350,1196],"template",{"path":194,"title":193,"description":1352,"tags":1353,"category":193,"featured":1159,"updatedAt":1238,"createdAt":1238,"readingTime":287,"draft":1159},"Reusable starting points for files, configs and docs.",[],{"path":212,"title":211,"description":1355,"tags":1356,"category":204,"featured":1159,"updatedAt":1238,"createdAt":1238,"readingTime":308,"draft":1159},"The frontmatter and markdown conventions every note in this knowledge base follows.",[1357,1358,1359,1360],"meta","conventions","markdown","authoring",{"path":216,"title":215,"description":1362,"tags":1363,"category":204,"featured":1159,"updatedAt":1238,"createdAt":1238,"readingTime":308,"draft":1159},"Every formatting feature this knowledge base supports, on one page — a living reference and rendering test.",[1359,1364,1365],"mdc","reference",{"path":205,"title":204,"description":1367,"tags":1368,"category":204,"featured":1159,"updatedAt":1238,"createdAt":1238,"readingTime":287,"draft":1159},"How this knowledge base itself is built and maintained.",[],{"path":227,"title":226,"description":1370,"tags":1371,"category":219,"featured":1159,"updatedAt":1238,"createdAt":1238,"readingTime":287,"draft":1159},"What a CORS error actually means and how to fix it — on the server, where it belongs.",[1372,1373,1374,1315],"cors","http","apis",{"path":220,"title":219,"description":1376,"tags":1377,"category":219,"featured":1159,"updatedAt":1238,"createdAt":1238,"readingTime":287,"draft":1159},"Symptoms, causes and fixes for problems worth remembering.",[],1785598841067]