ฉันกำลังดูการประเมินค่า ORM
ผมเคยใช้SubSonic , Linq เพื่อ SQLและEntity Framework ฉันมีทีมนักพัฒนาตั้งแต่รุ่นน้องจนถึงรุ่นพี่
อะไรคือเกณฑ์ในการประเมิน ORM for.NET?
ฉันกำลังดูการประเมินค่า ORM
ผมเคยใช้SubSonic , Linq เพื่อ SQLและEntity Framework ฉันมีทีมนักพัฒนาตั้งแต่รุ่นน้องจนถึงรุ่นพี่
อะไรคือเกณฑ์ในการประเมิน ORM for.NET?
คำตอบ:
มันเป็นคำถามที่โหลด
มี ORM ที่ดีมากจำนวนมากที่เข้าใกล้หัวเรื่องด้วยปรัชญาที่แตกต่างกัน
ไม่มีใครที่สมบูรณ์แบบและมีแนวโน้มที่จะซับซ้อนทันทีที่คุณหลงทางจากเส้นทางสีทองของพวกเขา (และบางครั้งแม้เมื่อคุณติดอยู่)
สิ่งที่คุณควรถามตัวเองเมื่อเลือก ORM:
คุณต้องทำอะไรเพื่อคุณ?
หากคุณมีชุดข้อกำหนดสำหรับแอปพลิเคชันของคุณอยู่แล้วคุณควรเลือก ORM ที่ตรงกับสิ่งเหล่านี้มากกว่าที่จะเป็น 'ดีที่สุด' สมมุติฐาน
ข้อมูลของคุณมีการแชร์หรือเฉพาะที่
ความยุ่งเหยิงจำนวนมากใน ORM นั้นเกิดจากวิธีที่พวกเขาจัดการกับการเกิดพร้อมกันและการเปลี่ยนแปลงข้อมูลในฐานข้อมูลเมื่อผู้ใช้หลายคนกำลังถือข้อมูลรุ่นเดียวกัน
ถ้าที่เก็บข้อมูลของคุณสำหรับผู้ใช้คนเดียว ORM ส่วนใหญ่จะทำงานได้ดี อย่างไรก็ตามถามคำถามยาก ๆ กับตัวเองในสถานการณ์ที่มีผู้ใช้หลายคน: การล็อคถูกจัดการอย่างไร? จะเกิดอะไรขึ้นเมื่อฉันลบวัตถุ มันส่งผลกระทบต่อวัตถุอื่น ๆ ที่เกี่ยวข้องได้อย่างไร ORM ทำงานใกล้เคียงกับโลหะของแบ็กเอนด์หรือแคชข้อมูลจำนวนมาก (ปรับปรุงประสิทธิภาพโดยเพิ่มค่าใช้จ่ายในการเพิ่มความเสี่ยงต่อความสกปรก)
ORM เหมาะสำหรับแอปพลิเคชันประเภทของคุณหรือไม่ ORM ที่เฉพาะเจาะจงอาจทำงานได้ยาก (มีค่าโสหุ้ยในการทำงานจำนวนมากและยากที่จะเขียนโค้ด) หากใช้ในการบริการหรือนั่งอยู่ในเว็บแอป มันอาจจะยอดเยี่ยมสำหรับแอพเดสก์ท็อป
คุณต้องยกเลิกการปรับปรุงเฉพาะฐานข้อมูลหรือไม่
ORMs มักจะใช้ชุดตัวหารร่วมที่ต่ำที่สุดของ SQL เพื่อให้แน่ใจว่าพวกเขาทำงานกับแบ็กเอนด์ฐานข้อมูลที่แตกต่างกันมากมาย
ORM ทั้งหมดจะประนีประนอมกับคุณสมบัติที่มีอยู่ (เว้นแต่ว่าพวกเขาจะกำหนดเป้าหมายแบ็กเอนด์เดียว) แต่บางอย่างจะช่วยให้คุณสามารถใช้พฤติกรรมเพิ่มเติมเพื่อใช้ประโยชน์จากการปรับปรุงเฉพาะที่มีอยู่ในแบ็กเอนด์ที่คุณเลือก
การปรับปรุงเฉพาะ db ทั่วไปคือความสามารถในการค้นหาข้อความแบบเต็มตัวอย่างเช่น ตรวจสอบให้แน่ใจว่าออมของคุณมีวิธีการเข้าถึงคุณลักษณะเหล่านี้หากคุณต้องการ
ORM จัดการการเปลี่ยนแปลงในตัวแบบข้อมูลอย่างไร
บางคนสามารถอัปเดตฐานข้อมูลโดยอัตโนมัติภายในขอบเขตที่กำหนดบางอย่างไม่ทำอะไรเลยและคุณจะต้องทำงานสกปรกด้วยตัวเอง อื่น ๆ จัดเตรียมเฟรมเวิร์กสำหรับจัดการการเปลี่ยนแปลงที่ให้คุณควบคุมการอัพเดตฐานข้อมูล
คุณคิดที่จะเชื่อมโยงแอปพลิเคชันของคุณกับวัตถุของ ORM หรือคุณต้องการจัดการกับ POCO และใช้อะแดปเตอร์เพื่อคงอยู่หรือไม่?
อดีตมักจะง่ายต่อการจัดการ แต่สร้างการพึ่งพาวัตถุข้อมูลเฉพาะ ORM ของคุณทุกหนทุกแห่งหลังมีความยืดหยุ่นมากขึ้นในราคาของรหัสอีกเล็กน้อย
คุณจะต้องถ่ายโอนวัตถุของคุณจากระยะไกลหรือไม่?
ORM ทั้งหมดไม่เท่ากันเมื่อนำวัตถุออกจากเซิร์ฟเวอร์ระยะไกลให้ดูอย่างใกล้ชิดในสิ่งที่เป็นไปได้หรือเป็นไปไม่ได้ที่จะทำ บางตัวก็มีประสิทธิภาพ
มีคนที่คุณสามารถหันไปขอความช่วยเหลือหรือไม่?
มีการสนับสนุนทางการค้าที่ดีหรือไม่? ชุมชนรอบโครงการมีขนาดใหญ่และแอ็คทีฟขนาดเท่าใด
ปัญหาที่ผู้ใช้ปัจจุบันมีกับผลิตภัณฑ์คืออะไร
พวกเขาได้รับการแก้ปัญหาอย่างรวดเร็วหรือไม่?
ORM สองสามตัวที่ฉันดู:
แน่นอนว่ามีอีกหลายคน
คุณสามารถดูที่เว็บไซต์ที่มีการโต้เถียงORM Battleซึ่งแสดงรายการมาตรฐานประสิทธิภาพบางประการแม้ว่าคุณจะต้องทราบว่าความเร็วที่แท้จริงไม่จำเป็นต้องเป็นปัจจัยที่สำคัญที่สุดสำหรับโครงการของคุณและผู้ผลิตเว็บไซต์นั้นคือ DataObject.Net
ฉันใช้NHibernateและพบว่าค่อนข้างดี
ในกรณีของฉันเชื่อมโยงกับฐานข้อมูล MS SQL แต่คุณสามารถเชื่อมต่อกับฐานข้อมูลอื่น ๆ
ใช้เวลาไม่นานในการเริ่มต้นใช้งาน - เพียงจับคู่ออบเจ็กต์ของคุณกับโมเดล - ฉันใช้ไฟล์ xml แต่คุณสามารถทำได้อย่างคล่องแคล่วในโค้ด มีชุมชนที่ยอดเยี่ยมและโดยส่วนตัวฉันพบว่างานของ Ayendeมีประโยชน์มากฉันใช้ NHProf ซึ่งเป็นเครื่องมือทำโปรไฟล์ sql
ฉันส่วนใหญ่ใช้ฟังก์ชั่นนอกกรอบ - การแมปออบเจ็กต์แบบตรง แต่ฉันก็ใช้ภาษาฮิเบอร์เนทเควสต์ซึ่งค่อนข้างง่ายที่จะได้รับการตอบรับ
น่าเศร้าที่ในสามงานสุดท้ายของฉันเรามี ORM ที่ปลูกเองถึงสามบ้าน ในแต่ละกรณีพวกเขาส่วนใหญ่ดูดด้วยเหตุผลที่แตกต่างกัน
ฉันเพิ่งได้รับการประเมินEntity Framework 4และการสนับสนุน POCO (คำแนะนำที่ดีอยู่ที่นี่ ) และรู้สึกประทับใจอย่างมากกับการอยู่ห่างจากใบหน้าของฉันและทำให้ฉันรู้สึกว่าฉันกำลังเขียนโปรแกรมอีกครั้งมากกว่าการลงทุนในทิศทางเดียวกัน
ฉันชอบ Linq ถึง SQL มาก มันง่ายและมีนักออกแบบที่ดี อย่างไรก็ตามฉันหวังว่าจะจบชีวิตได้ด้วยกรอบเอ็นติตี้ ฉันต้องการที่จะใช้ประโยชน์จากความสามารถในการปรับเปลี่ยนเครื่องกำเนิดไฟฟ้าเพื่อที่ฉันจะได้ปรับแต่งวัตถุ
ประโยชน์ที่ใหญ่ที่สุดที่พวกเขามีเหนือคนอื่น ๆ (ในความคิดของฉัน) คือพวกเขาออกนอกกรอบกับ VS สิ่งนี้ก็เป็นลบเช่นกันเมื่อคุณอยู่ในความเมตตาของ MS (ดู Linq ถึง Sql)
[การปฏิเสธความรับผิด: ฉันทำงานให้กับ DevExpress]
คุณสามารถดูภาพหน้าจอของการใช้งานทั่วไปที่สร้างขึ้นโดย DevExpress กรอบการประยุกต์ใช้ที่นี่ หน้านี้ยังมีบทวิจารณ์สั้น ๆ เกี่ยวกับผลิตภัณฑ์ของเรา สำหรับข้อมูลรายละเอียดเพิ่มเติมเกี่ยวกับสาเหตุที่ฉันขอแนะนำให้คุณตรวจสอบหน้าผลิตภัณฑ์ที่เกี่ยวข้องในเว็บไซต์ของเรา
สำหรับ DevExpress XAF และ XPO, นี่เป็นคำอธิบายที่ดีเกี่ยวกับเหตุผลในการเลือกกรอบโปรแกรมของเรา นอกจากนี้เรายังให้การสนับสนุนและเอกสารซึ่งเป็นเรื่องสำคัญและคุ้มค่าที่จะกล่าวถึง อย่าลังเลที่จะติดต่อเราในกรณีที่มีคำถามใด ๆ
เราใช้ NHibernate + Fluent NHibernate ด้วย Linq-to-Sql ในโครงการขนาดเล็ก เหตุผลนี้คือ:
1) (ไม่ใช่เหตุผลหลัก) NHibernate ดูเหมือนจะมีปัจจัย "ความเคารพ" ที่สูงขึ้นในหมู่นักพัฒนา (เป็นจริงหรือไม่)
2) เปรียบเทียบกับ linq-to-SQL, nHibernate อนุญาตการทำแผนที่ ORM ระหว่างวัตถุ Db และเอนทิตีที่ไม่แมป 1 ต่อ 1
3) เรายังไม่ได้ทำการเปรียบเทียบ nHibernate กับ Entity Framework 4.0 แต่นี่เป็นการเปรียบเทียบที่ดี: http://ayende.com/blog/archive/2010/01/05/nhibernate-vs.-entity-framework-4.0.aspx
n ไฮเบอร์เนตมีเส้นโค้งการเรียนรู้ค่อนข้างสูงและแผนที่ XML ของมันค่อนข้างละเอียด แต่เริ่มต้นด้วยเอกสารไซต์ Fluent Nhibernate และย้อนกลับไปด้านหลัง
ไม่มีกรอบ ORM ที่ "ดีที่สุด" เพราะทุกคนมีจุดแข็งและจุดอ่อนที่แตกต่างกันและมีแนวโน้มที่จะเป็นเช่นนั้นหากผู้พัฒนาเลือกที่จะมุ่งเน้นที่การทำให้พื้นที่หนึ่งดีขึ้น แบบจำลองแรกเทียบกับฐานข้อมูลก่อน)
ในทางกลับกันมีของดี ๆ จำนวนหนึ่งซึ่งบางอันจะเหมาะกับสถานการณ์และปรัชญาส่วนตัวของคุณมากกว่าคนอื่น
แก้ไข: สำหรับสิ่งที่คุ้มค่าฉันกำลังใช้ Linq ไปยัง SQL - ส่วนใหญ่เป็นเพราะมีบางส่วนเพราะมันเหมาะสมมากสำหรับความพยายามน้อยที่สุดและอาจจะพัฒนา Entity Framework อีกครั้ง "เพราะมี" (แม้ว่าคล้ายกันยังมี มีอะไรมากมายเกี่ยวกับ EF4 ที่ถูกต้องและบางอย่างผิดปกติ) ความกังวลโดยเฉพาะอย่างยิ่งในเรื่องหลังจะต้องมีประสิทธิภาพ แต่สำหรับกรณีส่วนใหญ่ของฉันนั่นไม่ใช่ปัญหาใหญ่และความสามารถในการเรียกใช้ข้อมูลแบบไดนามิกและ OData จากรุ่น (L2S และ EF) มีประโยชน์มากมายสำหรับฉันในแง่ของ " ชนะ "ถูก"
ฉันจะแนะนำให้คุณมีลักษณะที่DevExpress XPO สิ่งนี้พร้อมกับDevExpress XAFจะทำให้ชีวิตของนักพัฒนาซอฟต์แวร์ง่ายขึ้นเมื่อการเรียนรู้ข้ามไป
เราโชคดีกับ Entity Framework สถานการณ์ของเราค่อนข้างผิดปกติ - เราทำการรวบรวมข้อมูลสำหรับทีมรายงานดังนั้นพวกเขาจึงออกแบบฐานข้อมูลจริง เราได้รับฐานข้อมูลจากนั้นเพียงใช้ EF เพื่อสร้างคลาสการเข้าถึงข้อมูลจากนั้น ใช้งานได้ดีสำหรับเรา แต่เราทำการโหลดข้อมูลจำนวนมากดังนั้นฉันไม่สามารถรับรองได้ว่ามันจะทำงานได้ดีเพียงใดในสภาพแวดล้อมการทำธุรกรรมที่มากขึ้น
NHibernate (+ FluentNHibernate) จะเป็นตัวเลือกเริ่มต้นสำหรับฉัน มันมีความยืดหยุ่นขยายและแข็งแกร่ง มีผู้ใช้จำนวนมากและได้รับการดูแลอย่างดี ข้อเสียคือช่วงการเรียนรู้ที่สูงชัน
LightSpeed ของ MindScapeนั้นเรียบง่ายและใช้งานง่าย แต่ยังคงความยืดหยุ่นและความสามารถพอสมควร มันมีพื้นผิวของนักออกแบบเช่น L2S / EF และการใช้งาน UnitOfWork
ดีไม่มีตัวเลือก "ดีที่สุด" แต่ฉันจะบอกว่าปกติ Linq กับ SQL ตรงกับความต้องการของคุณ มันไม่ได้เป็น ORM ที่ "จริง" ต่อ se แต่มันมีน้ำหนักเบามากและให้ความยืดหยุ่นในการเขียนโค้ดโดยที่ไม่รู้ตัวถ้ามันสมเหตุสมผล สิ่งที่ฉันหมายถึงคือคุณสามารถเขียนโค้ดต่อไปได้ตามปกติโดยไม่ต้องระวัง Linq จริงๆนอกจากการมีdbml
ไฟล์ คุณยังสามารถเขียน abstractions ได้โดยใช้รูปแบบ Repository หรือ Gateway และ L2S เติมเต็มบทบาทหลักของ ORM ซึ่งคือการหลีกเลี่ยง Object-Relational Mismatch
Entity Framework นั้นค่อนข้างหนักและในขณะที่ฉันขลุกอยู่กับมันนิดหน่อยมันมากกว่า "พื้นฐานในหน้าของคุณ" มากกว่า Linq พื้นฐานถึง Sql แต่ EF นั้นเป็น ORM ที่แท้จริงมากกว่า Linq ฉันจะดูเกณฑ์ทั้งหมดที่คุณต้องการใน ORM เป็นเพราะคุณต้องการหลีกเลี่ยงการเขียน SQL ดิบหรือยิ่งกว่านั้นมีกระบวนงานที่เก็บไว้หลายร้อยรายการ คุณต้องการคุณสมบัติพิเศษบางอย่างที่ Linq ถึง SQL ไม่สามารถให้ได้หรือไม่ คุณต้องตอบคำถามเหล่านั้น แต่ตามความต้องการสั้น ๆ ของคุณ ("น้ำหนักเบาและใช้งานง่าย") ฉันคิดว่า Linq ง่ายกว่า Subsonic เล็กน้อยและติดตั้ง Visual Studio ในตัว
ECO :) มันเป็นมากกว่า ORM ในขณะที่รวมถึงเครื่องรัฐและ OCL ที่ปฏิบัติการได้ (คือ EAL) รองรับ มีรุ่นฟรีพร้อมข้อ จำกัด โดเมน 12 คลาสซึ่งฉันคิดว่าน่าจะเรียบร้อยสำหรับโครงการขนาดเล็ก