อัปเดต:ฉันไม่ได้ใช้ Entity Framework ตั้งแต่เวอร์ชัน 4.0 ดังนั้นคำตอบของฉันจึงอาจล้าสมัย ฉันยังคงใช้ NH หรือ ADO .NET บริสุทธิ์ในโครงการของฉัน และฉันไม่อยากดูว่ามีอะไรใหม่ใน EF ตั้งแต่ 4.0 เพราะ NH ทำงานได้อย่างสมบูรณ์แบบ
จริงๆแล้วมันค่อนข้างง่ายที่จะเปรียบเทียบเมื่อคุณใช้ทั้งสองอย่าง มีข้อ จำกัด ร้ายแรงบางประการกับ EF4 ฉันสามารถตั้งชื่อบางอย่างที่ฉันพบด้วยตนเอง:
ปัญหา EF4:
- การโหลดและสร้างผลลัพธ์อย่างกระตือรือร้น: ระบบโหลด EF4 กระตือรือร้น (รวม ("เส้นทาง")) สร้าง SQL ที่ไม่เหมาะสมด้วยการวนลูป JOIN ซึ่งจะทำให้เวลาดำเนินการหลายพันครั้ง (ไม่ใช่ตามตัวอักษร) ช้าลงสำหรับความสัมพันธ์แบบกลุ่มต่อกลุ่มจากนั้นจึงเขียน SQL ด้วยมือ (มัน ใช้ไม่ได้อย่างมีประสิทธิภาพ)
- Materializer ไม่สามารถกำหนดเอนทิตีที่เกี่ยวข้องได้ : หากคุณคิดว่าสามารถเอาชนะปัญหาก่อนหน้านี้ได้โดยการให้แบบสอบถาม SQL ของคุณเองคุณคิดผิด EF4 ไม่สามารถกำหนดเอนทิตีที่เกี่ยวข้อง (แมป) จากการสืบค้น JOIN SQL ได้มันสามารถโหลดข้อมูลจากตารางเดียวเท่านั้น (ดังนั้นหากคุณมี Order.Product สินค้า SELECT * FROM order LEFT JOIN จะเริ่มต้นเฉพาะวัตถุ Order เท่านั้น Product จะยังคงเป็นโมฆะ คิดว่ามีการดึงข้อมูลที่จำเป็นทั้งหมดในแบบสอบถามเพื่อเริ่มต้น) สิ่งนี้สามารถเอาชนะได้โดยใช้ส่วนเสริมชุมชน EFExtensions แต่โค้ดที่คุณจะต้องเขียนมันน่าเกลียดมาก (ฉันลองแล้ว)
เอนทิตีการติดตามตนเอง: หลายคนบอกว่าเอนทิตีการติดตามตนเองนั้นยอดเยี่ยมสำหรับการพัฒนาระดับ N รวมถึงคำตอบยอดนิยมในชุดข้อความนี้ คิดว่าฉันยังไม่ได้ลองพวกเขาฉันบอกได้เลยว่ามันไม่ใช่ทุกอินพุตสามารถปลอมแปลงได้คุณไม่สามารถใช้การเปลี่ยนแปลงที่ผู้ใช้ส่งให้คุณและนำไปใช้กับฐานข้อมูลทำไมไม่ให้ข้อมูลโดยตรงกับผู้ใช้ เข้าถึงฐานแล้ว? วิธีใดก็ตามที่คุณจะต้องโหลดข้อมูลผู้ใช้กำลังจะเปลี่ยนจาก DB ตรวจสอบว่ามีอยู่ | ไม่มีอยู่ทำการตรวจสอบสิทธิ์ ฯลฯ เป็นต้นคุณไม่สามารถไว้วางใจผู้ใช้ในสถานะของเอนทิตีที่เขากำลังส่งไปยังเซิร์ฟเวอร์ได้อยู่ดี ต้องโหลดเอนทิตีนี้จาก DB และพิจารณาว่าเป็นสถานะและสิ่งอื่น ๆ ดังนั้นข้อมูลนี้จึงไร้ประโยชน์เช่นเดียวกับเอนทิตีการติดตามตนเองเว้นแต่คุณจะทำระบบ n-tier ส่วนตัวที่เชื่อถือได้สำหรับการใช้งานภายในซึ่งในกรณีนี้คุณอาจให้ข้อมูลธรรมดา การเข้าถึงฐานข้อมูล
การบันทึกเหตุการณ์การรวมตรรกะทางธุรกิจ: EF4 เป็นเหมือนกล่องดำมันทำอะไรบางอย่างและคุณไม่รู้ว่ามันทำอะไร มีเพียงเหตุการณ์เดียวเท่านั้น OnSavingChanges ที่คุณสามารถใส่ตรรกะทางธุรกิจบางอย่างที่คุณต้องเรียกใช้ก่อนที่จะมีบางสิ่งเกิดขึ้นกับ DB และหากคุณต้องการใช้การเปลี่ยนแปลงบางอย่างกับวัตถุทางธุรกิจก่อนที่จะเกิดอะไรขึ้นคุณจะต้องขุดใน ObjectStateManager และสิ่งนี้น่าเกลียดจริงๆ รหัสสามารถกลายเป็นขนาดใหญ่ ตัวอย่างเช่นหากคุณใช้รูปแบบพื้นที่เก็บข้อมูลและสิ่งที่ต้องแจ้งเกี่ยวกับการเปลี่ยนแปลงที่เกิดขึ้นกับ DB ในรูปแบบอ็อบเจ็กต์ที่สะอาดคุณจะมีปัญหาในการทำเช่นนี้กับ EF
ความสามารถในการขยาย:โค้ด EF ทั้งหมดเป็นแบบส่วนตัวและเป็นการใช้งานภายในหากคุณไม่ชอบบางสิ่งบางอย่าง (และคุณจะไม่ชอบอะไรมากมายหากคุณจริงจังกับการใช้ EF) ไม่มีทางที่คุณจะเปลี่ยนสิ่งนี้ด้วยวิธีง่ายๆในความเป็นจริงฉันแน่ใจ ง่ายกว่าที่จะเขียนว่าคุณเป็นเจ้าของ ORM ตั้งแต่เริ่มต้น (ฉันทำแล้ว) จากนั้นให้ EF ทำงานตามที่คุณต้องการ ตัวอย่างเช่นดูที่แหล่งที่มา EFExtensions ซึ่งขึ้นอยู่กับวิธีการส่วนขยายและ "แฮ็ก" ที่แตกต่างกันเพื่อให้ EF ใช้งานได้มากขึ้นเล็กน้อยและโค้ดก็ค่อนข้างน่าเกลียด (และไม่ใช่ความผิดของผู้เขียนเมื่อทุกอย่างใน EF เป็นแบบส่วนตัวนี่เป็นเพียงสิ่งเดียว วิธีการขยาย)
ฉันสามารถเขียนเรื่องแย่ ๆ เกี่ยวกับ EF ต่อไปได้และเจ็บปวดแค่ไหนที่ฉันต้องทำงานกับมันเพื่อไลค์ 20 หน้าและบางทีฉันอาจจะทำได้
แล้ว NHibernate ล่ะ? มันแตกต่างกันอย่างสิ้นเชิงเหมือนกับการเปรียบเทียบ PHP กับ C #, EF4 ก็เหมือนกับในยุคหินเหมือนกับว่า EF มีอายุ 10 ปีหลังจากนั้น NHibernate กำลังอยู่ในระหว่างการพัฒนาและในความเป็นจริง Hibernate เริ่มต้นในปี 2544 หากคุณมีเวลาว่าง หากต้องการเรียนรู้และเปิด Nhibernate ให้ทำ