Showing posts with label C#. Show all posts
Showing posts with label C#. Show all posts

การเปลี่ยน edmx file ใน .Net

คราวที่แล้ว พูดถึงการเปลี่ยนชื่อโปรเจค คร่าวนี้มาถึงตาที่เราอยากจะแก้ชื่อ edmx หรือ entity data model ที่เป็นไฟล์ XML กันบ้าง ซึ่งโดยปกติ edmx นี้จะสร้างมาจากการ add item ADO.NET Entity Data Model และเมื่อเราสร้างแล้ว เราสามารถให้ VS มันสร้าง file entity .cs ได้ ซึ่งมันก็จะสร้าง 


  • Model Context.tt
  • Model Context.cs
  • Model .tt
ขึ้นมาด้วย ซึ่งชื่อของไฟล์ทั้งหมดก็จะมาจากชื่อของ file .edmx นั่นเอง แต่ถ้าเราจะเปลี่ยนชื่อของ .edmx ก็จะเป็นเรื่องใหญ่ ที่เดียว แต่ก็ไม่ใช่ว่าทำไม่ได้ โดยเรา

1. rename file .edmx 
โดยคลิ๊กขวา ที่ file .edmx แล้วเลือก rename 

2. ลบ ไฟล์ที่เป็น .Context.tt และ .tt ออก
3. สร้างไฟล์ .Context.tt และ .tt ใหม่ โดยคลิ๊กขวาที่ Diagram และ คลิ๊ก "Add Code Generation Item..."


เสร็จแล้ว เลือก version ของ Entity Framework ที่ใช้ ตั้งชื่อไฟล์ .tt กด Add


เสร็จแล้ว ก็อย่าลืมลอง Generate database from model ใหม่อีกทีนะค่ะได้เลยคะ





การเปลี่ยน namespace & project folder ใน .Net

จากความที่เคยเขียน java มา พอมาใช้ .Net รู้สึกถึงความไม่คุ้นอย่างมาก อย่างแรกเลย คือ folder ของ .Net ไม่ได้เกี่ยวอะไรกับ namespace เลยสักนิดเดียว คือจริงๆ จะตั้งตรงกันหรือไม่ตรงกันก็ได้ (ซึ่งก็ไม่รู้ว่าจะไม่ตรงกันทำไม ใครมีความรู้มาบอกบ้างก็ดีนะค่ะ) และ namespace ก็ไม่จำเป็นต้องตรงกับชื่อไฟล์ project ที่เป็น .csproj แปลว่ามีชื่ออยู่ 3 ส่วนด้วยกัน คือ

  1. ชื่อ folder ของ project
  2. ชื่อ project หรือ file .csproj
  3. ชื่อ namespace 


ซึ่งไม่จำเป็นจะต้องเป็นชื่อเดียวกัน แต่ถ้าใครอยากจะแก้ให้ชื่อทั้งสามเป็นชื่อเดียวกัน ก็มีวิธีที่ไม่ได้ยากเย็นอะไร แต่ต้องเข้าใจ ดังนี้

1. แก้ชื่อ folder

วิธีคือ จะต้องแก้ชื่อ folder ตรงๆ เหมือนที่เราแก้ชื่อ folder ทั่วๆ ไป แต่...หลังจากที่เราแก้แล้ว ใน solution จะหา project นั้น ไม่เจอ แล้วมันจะยอมให้เราแก้ไข property project folder ซึ่งโดยปกติ มันจะไม่ให้เราแก้ไข เราก็แค่เลือก folder ที่เราแก้ไขชื่อให้ถูกต้องก็เป็นอันเสร็จ



2. แก้ไขชื่อ project หรือ file .csproj

ทั้งนี้ ชื่อ project ที่แสดงใน solution มันเหมือนจะดึงมาจากชื่อไฟล์ .csproj นั่นเอง ซึ่งอันนี้แก้ได้ง่ายๆ โดย click ขวาที่ชื่อ project แล้วก็เลือก rename ใส่ชื่อที่ต้องการก็เป็นอันเสร็จ


3. แก้ชื่อ namespace

คลิ๊กขวาที่ชื่อ project แล้วเลือก Properties ซึ่งจะแสดงหน้าต่างอีกอันหนึ่ง (ซึ่งไม่เข้าใจเหมือนกันว่า ทำไมไม่เป็นอันเดียวกับ properties windows แล้วแก้ไข Default namespace กันได้ (ทั้งนี้ปกติเราก็จะแก้ไข Assembly name ไปด้วย โดยเข้าใจว่า assembly name คือชื่อของ file .dll ที่เราจะได้ และก็จะแก้ไขเข้าไปถึง Assembly Information ด้วย)


ก็เป็นอันเสร็จเรียบร้อย

ปกติคุ้นกับ Eclipse ที่ rename ปุ๊บ มันแก้ทุกอย่างให้หมดเลย ทั้งนี้ .Net มันคงต้องการให้ยืดหยุ่นที่จะสามารถตั้งชื่อทุกอย่างแยกจากกันได้อ่ะมั้ง (กำลังพยายามเข้าใจมัน)

จบจ้า


.net unable to cast of type dbquery`1 [] to type objectquery

ช่วงนี้กำลังศึกษา .Net Entity Framework อยู่ค่ะ

แล้วก็เลยลองทำ ADO.Net Entity Framwork Quick Start ดูค่ะ

ก็ทำตามไปเรื่อยๆ แต่มาสะดุดเอาตรง (เราใช้ EF 6.1 ค่ะ ตามที่ได้ Nuget ออกมา)

this.departmentList.DataSource = ((ObjectQuery)departmentQuery).Execute(MergeOption.AppendOnly);


ซึ่งมี Exception ตอน runtime ค่ะ ซึ่งตามชื่อหัวข้อเลยค่ะ มัน cast จาก DbQuery ไป ObjectQuery ไม่ได้ ก็หาอยู่นานค่ะ เพราะก็เพิ่งจะอ่าน Quick Start อ่ะเน้อะ จะไปรู้เรื่องอะไร

สรุปเลยละกันค่ะ คือมัน cast ไม่ได้ค่ะ ถูกแล้ว เพราะ edmx มันสร้างเป็น DbSet ซึ่ง query ที่ได้จะเป็น DbQuery ก็ต้องใช้มันทั้งแบบนั้นค่ะ แต่แล้วใช้แบบนั้นมันใช้ยังไงฟร่ะ ก็หากันต่อไปค่ะ ก็มามั่วเองจนได้ ซึ่งที่ถูกควรจะเป็น

this.departmentList.DataSource = departmentQuery.ToList();

จึงแจ้งมาเผื่อใครจะเป็นเหมือนกัน

Reference:
ADO.Net Entity Framwork Quick Start

Entity Framework 4.1: Unable to cast from DbQuery to ObjectQuery

C# Format Item Syntax

สำหรับคนที่เพิ่งมาเรียนรู้ C# ใหม่ๆ เวลาเห็นคำสั่ง Console.Write หรือ Console.WriteLine (ซึ่งเราใช้มากสำหรับการทดสอบระบบ) อาจจะเห็น string แปลกๆ ที่อยู่ใน { } ซึ่งจะเขียน Format Item Syntax ซึ่งมี syntax ง่ายๆ คือ

{ index[,alignment][:formatString]}

index เป็น ลำดับของตัวแปรที่เป็น parameter ต่อท้ายมา
alignment ถ้าเป็น ค่าบวก คือชิดขวา ค่าลบ ชิดซ้าย
formatString ก็คือเป็น format ที่จะให้แสดงออกมานั้นเอง 

ตัวอย่าง


Console.Write("Name = {0}, hours = {1,1:hh}", myName, DateTime.Now);

{0} ก็จะแสดงเป็นค่าของ myName
{1:hh} จะแสดงเป็นค่า DateTime.Now โดยแสดงเป็น ชั่วโมง ชิดขวา

Reference:
Composite Formatting

Missing item ADO.Net Data Entity Model

สำหรับใครที่จะใช้ Entity Framework แล้วเป็นเหมือนเรา คือพยายามตามหา item ADO.Net Data Entity Model แต่ว่าไม่มี


หาอ่านอยู่หลายที่ก็ยังไม่รู้ว่าวิธีแก้ทำยังไงนะค่ะ ติดตั้ง EntityFramework package จาก NuGet ก็แล้ว ก็ยังไม่ได้

ง่ายมากค่ะ ให้หา Entity Framework Tools มาลงค่ะ (ลิงค์ที่ให้ไว้เป็นของ version 6 ค่ะ) แค่นั้นเอง ไม่ได้เกี่ยวกับการ install Entity Frameowork package เลยแม้แต่น้อย 


Test run C# console application

เพิ่งจะเรียน C# ค่ะ เปิดใช้ Visual Studio ด้วยความงุนงง เพราะที่เคยใช้มันตั้งแต่เมื่อสมัยยังละอ่อน ยังไม่มี .Net Framework นู้นเลย และโปรแกรมแรก Hello World ซึ่งเป็น Console Application เขียนเสร็จ เอาละซิ จะเทสต์ยังไงฟร่ะ พอกด Start มันก็จะทำงานเปิด Console ขึ้นมาอย่างรวดเร็ว และจบไปอย่างรวดเร็ว สรุปว่า Hello World ของตรูสำเร็จม่ะเนี้ยะ มองไม่ทัน "-__-

และแล้วก็ได้มาเจอคำสั่ง หยุดหน้าจอ (ไม่ใช่ล่ะ) คือเป็นคำสั่งที่รอรับแป้นพิมพ์ก่อนด้วย

Console.ReadKey() 

โอ้ว เห็น Hello World แล้ว

บทเรียนต่อไปค่ะ โปรแกรมสำหรับรับ argument เขียนเสร็จ เอ่อ ... แล้วมันจะใส่ argument ยังไงฟร่ะ ตอนเทสต์ หาไปค่ะ หายังไงก็หาไม่เจอ (เพราะมันไม่มี) และได้มาพบกับ Tools Command Prompt บน Visual Studio Tools ค่ะ ซึ่งจะมาพร้อมกับตอนที่เราลง VS เลยค่ะ


แต่อ้าว.. แล้วนู๋จะต้องสั่ง compile บน Command Prompt หรือนี่... จริงๆ ก็ไม่ยากนะค่ะ แต่ แล้วตรูจะมี VS ไว้ทำแป๊ะอาราย แต่ก็นึกขึ้นได้ว่า ใน VS มันมี Build นี่หว่า Build แล้วไปไหนหว่า อันนี้หาไม่ยากค่ะ ไปส่องๆ ใน directory ที่เราเขียนโปรแกรมนะแหละ มันจะมี directory ชื่อ bin ค่ะ ถ้าเราสร้าง project เป็น Console Application พอ build แล้วก็จะได้ .exe อยู่ใน directory นี่แหละค่ะ เช่น ถ้าเราสร้าง solution ชื่อ Example และ project ชื่อ ConsoleTutorial ไว้ ก็จะได้ .exe อยู่ใน

...\Example\ConsoleTutorial\bin

เมื่อรู้ดังนี้แล้วก็ง่ายละค่ะ เราก็ใช้ VS build solution ตามปกติค่ะ แล้วก็เปิด Tools Command Prompt แล้วเปิดไป directory bin เลยค่ะ แล้วก็สั่ง

> ConsoleTutorial.exe 1 2

อ่า... เรียบร้อย เทสต์ได้แล้ว... ไม่น่าเชื่อว่า เรื่องแค่นี้ หามาช้านาน เศร้าใจ สงสัยจะแก่แล้วจริงๆ