รหัสเป็นอันดับแรกเทียบกับรุ่น / ฐานข้อมูลก่อน [ปิด]


618

ข้อดีและข้อเสียของการใช้ Entity Framework 4.1 Code-first over Model / Database-first ด้วยไดอะแกรม EDMX คืออะไร

ฉันพยายามเข้าใจวิธีการทั้งหมดในการสร้างชั้นการเข้าถึงข้อมูลโดยใช้ EF 4.1 IoCฉันใช้รูปแบบและพื้นที่เก็บข้อมูล

ฉันรู้ว่าฉันสามารถใช้วิธีการแบบรหัสแรก: กำหนดเอนทิตีและบริบทด้วยมือของฉันและใช้ModelBuilderเพื่อปรับสคีมา

ฉันยังสามารถสร้างEDMXไดอะแกรมและเลือกขั้นตอนการสร้างรหัสที่ใช้เทมเพลต T4 เพื่อสร้างPOCOคลาสเดียวกัน

ในทั้งสองกรณีผมจบลงด้วยPOCOวัตถุที่ไม่เชื่อเรื่องพระเจ้าและบริบทที่เกิดขึ้นจากORMDbContext

ฐานข้อมูลดูเหมือนว่าจะน่าสนใจที่สุดตั้งแต่ฉันสามารถออกแบบฐานข้อมูลใน Enterprise Manager ได้อย่างรวดเร็วซิงค์โมเดลและปรับแต่งมันโดยใช้นักออกแบบ

แล้วความแตกต่างระหว่างสองแนวทางนี้คืออะไร? มันเกี่ยวกับการตั้งค่า VS2010 กับ Enterprise Manager หรือไม่?


12
Entity Framework 7 กำลังวาง EDMX: msdn.microsoft.com/en-us/magazine/dn890367.aspx
CAD bloke

5
@CADbloke Entity Framework 7 เป็นตอนนี้ Entity Framework Core 1.0
RBT

6
ไปยังเบราว์เซอร์อื่น ๆ ยกเว้นว่าคุณมี hardon สำหรับไฟล์ XML ขนาดยาว 7000 ไฟล์และการแก้ปัญหาความขัดแย้งที่เกิดขึ้นในข้างต้นให้ไปที่ code ก่อนและช่วยตัวเองด้วยอาการปวดหัว
Dan Pantry

3
มีบทความที่ดีมกราคม 2015 เขียนเกี่ยวกับสามวิธีที่roland.kierkels.net/c-asp-net/ …
danio

4
ทุกคำตอบที่ได้รับคือ"ฉันคิดว่า" ... คำจำกัดความที่แท้จริงของ
Lankymart

คำตอบ:


703

ฉันคิดว่าความแตกต่างคือ:

รหัสก่อน

  • เป็นที่นิยมมากเนื่องจากโปรแกรมเมอร์ฮาร์ดคอร์ไม่ชอบนักออกแบบทุกประเภทและการกำหนดแผนที่ใน EDMX xml นั้นซับซ้อนเกินไป
  • ควบคุมรหัสได้อย่างสมบูรณ์ (ไม่มีรหัสที่สร้างอัตโนมัติซึ่งแก้ไขได้ยาก)
  • ความคาดหวังทั่วไปคือคุณไม่ได้ใส่ใจกับ DB DB เป็นเพียงที่เก็บข้อมูลที่ไม่มีตรรกะ EF จะจัดการเรื่องการสร้างและคุณไม่ต้องการที่จะรู้ว่ามันทำงานอย่างไร
  • การเปลี่ยนแปลงฐานข้อมูลด้วยตนเองจะหายไปมากที่สุดเนื่องจากรหัสของคุณกำหนดฐานข้อมูล

ฐานข้อมูลก่อน

  • เป็นที่นิยมมากถ้าคุณมีฐานข้อมูลที่ออกแบบโดย DBAs พัฒนาแยกต่างหากหรือถ้าคุณมีฐานข้อมูลอยู่
  • คุณจะให้ EF สร้างเอนทิตีสำหรับคุณและหลังจากการปรับเปลี่ยนการแมปคุณจะสร้างเอนทิตี POCO
  • หากคุณต้องการคุณสมบัติเพิ่มเติมในเอนทิตี POCO คุณต้องแก้ไขเทมเพลต T4 หรือใช้คลาสบางส่วน
  • สามารถทำการเปลี่ยนแปลงฐานข้อมูลด้วยตนเองได้เนื่องจากฐานข้อมูลกำหนดรุ่นโดเมนของคุณ คุณสามารถอัปเดตโมเดลจากฐานข้อมูลได้ตลอดเวลา (คุณลักษณะนี้ทำงานได้ค่อนข้างดี)
  • ฉันมักจะใช้สิ่งนี้ร่วมกันกับโครงการฐานข้อมูล VS (เฉพาะรุ่นพรีเมี่ยมและ Ultimate)

รุ่นแรก

  • IMHO ได้รับความนิยมถ้าคุณเป็นแฟนดีไซเนอร์ (= คุณไม่ชอบเขียนโค้ดหรือ SQL)
  • คุณจะ "วาด" โมเดลของคุณและให้เวิร์กโฟลว์สร้างสคริปต์ฐานข้อมูลของคุณและเทมเพลต T4 สร้างเอนทิตี POCO ของคุณ คุณจะสูญเสียส่วนหนึ่งของการควบคุมทั้งเอนทิตีและฐานข้อมูลของคุณ แต่สำหรับโครงการขนาดเล็กที่ง่ายคุณจะมีประสิทธิผลมาก
  • หากคุณต้องการคุณสมบัติเพิ่มเติมในเอนทิตี POCO คุณต้องแก้ไขเทมเพลต T4 หรือใช้คลาสบางส่วน
  • การเปลี่ยนแปลงฐานข้อมูลด้วยตนเองจะหายไปมากที่สุดเนื่องจากแบบจำลองของคุณกำหนดฐานข้อมูล สิ่งนี้จะทำงานได้ดีขึ้นหากคุณติดตั้งชุดสร้างฐานข้อมูล มันจะช่วยให้คุณอัปเดตสคีมาฐานข้อมูล (แทนที่จะสร้างใหม่) หรืออัปเดตโครงการฐานข้อมูลใน VS

ฉันคาดหวังว่าในกรณีของ EF 4.1 มีคุณสมบัติอื่น ๆ ที่เกี่ยวข้องกับ Code First เทียบกับ Model / Database ก่อน API ของ Fluent ที่ใช้ใน Code ไม่ได้มีคุณสมบัติทั้งหมดของ EDMX ฉันคาดหวังว่าฟีเจอร์ต่างๆเช่นการแมปโพรซีเดอร์ที่เก็บไว้, การดูเคียวรี, การกำหนดมุมมอง ฯลฯ ทำงานเมื่อใช้ Model / Database ก่อนและDbContext(ฉันยังไม่ได้ลอง) แต่มันไม่ได้อยู่ใน Code ก่อน


5
@ Ladislav - ขอบคุณสำหรับคำตอบที่ครอบคลุม เพื่อชี้แจง: ยกเว้นข้อ จำกัด บางประการของ API ที่คล่องแคล่วไม่มีความแตกต่างทางเทคนิคที่แท้จริงระหว่างวิธีการเหล่านั้น เป็นเรื่องเกี่ยวกับการพัฒนา / การปรับใช้กระบวนการ / ระเบียบวิธีมากขึ้นใช่ไหม ตัวอย่างเช่นฉันมีสภาพแวดล้อมที่แยกต่างหากสำหรับ Dev / Test / Beta / Prod และฉันจะอัพเกรดฐานข้อมูลด้วยตนเองใน Beta / Prod เนื่องจากการเปลี่ยนแปลง schema อาจต้องมีการแก้ไขข้อมูลที่ซับซ้อน ด้วย Dev / Test ฉันมีความสุขที่ EF จะวางและสร้างฐานข้อมูลเพราะฉันจะเก็บข้อมูลทดสอบด้วยตัวเองใน initializers
Jakub Konecki

152
ฉันออกแบบฐานข้อมูลมาเป็นเวลานานฉันไม่สามารถจินตนาการได้ว่าจะทำอะไรนอกจากฐานข้อมูลก่อน ในความเป็นจริงฉันยังคงเขียนกระบวนงานที่เก็บไว้จำนวนมากสำหรับคำสั่งเลือกปริมาณที่มากขึ้นและจากนั้นฉันจะทำการนำเข้าฟังก์ชั่นไปยังโมเดล EF ทั้งหมดในชื่อของประสิทธิภาพ
Steve Wortham

9
คุณหมายถึงอะไรโดยการเลือกคำสั่งปริมาณมาก? ขั้นตอนการจัดเก็บจะไม่เร็วขึ้นจากนั้นเลือกส่งจากแอปพลิเคชัน
Piotr Perak

20
คุณสามารถมี SQL ในแอปพลิเคชันของคุณ SQL นั้นจะฝังตัวในโค้ดที่คอมไพล์ได้มากกว่าและการเปลี่ยนแปลงใด ๆ จะต้องมีการคอมไพล์ใหม่และการปรับใช้ใหม่ในขณะที่การเปลี่ยนแปลง Stored Procedure นั้นจะต้องแก้ไข Stored Procedure ลูกค้า / ลูกค้า / ผู้ใช้จะได้รับผลกระทบน้อยลงจากการเปลี่ยนแปลงในกรณีนี้
CodeWarrior

5
@JakubKonecki สิ่งที่คุณจะไม่พบในDbContextที่มีอยู่ว่าในเพียงแค่การใช้งานObjectContext ((IObjectContextAdapter)dbcontext).ObjectContext
Shimmy Weitzhandler

134

ฉันคิดว่า "ต้นไม้ตัดสินใจง่าย" โดย Julie Lerman ผู้เขียน "Programming Entity Framework" ควรช่วยในการตัดสินใจด้วยความมั่นใจมากขึ้น:

ต้นไม้ตัดสินใจที่จะช่วยเลือกแนวทางที่แตกต่างกับ EF

ข้อมูลเพิ่มเติมที่นี่


111
ยังไม่เสร็จสมบูรณ์ ถ้าคุณไม่ต้องการใช้นักออกแบบภาพ แต่คุณมีฐานข้อมูลอยู่แล้ว
เดฟใหม่

14
ที่แย่กว่านั้น ... การตัดสินใจในชีวิตจริงนั้นไม่ได้ทำโดยใช้แผนภาพแทนที่จะเป็นข้อ จำกัด ทางเทคนิคที่คุณต้องเผชิญเมื่อใช้รหัสเป็นอันดับแรกเช่นคุณไม่สามารถสร้างดัชนีที่ไม่ซ้ำกันในฟิลด์หรือคุณไม่สามารถลบข้อมูลแบบลำดับชั้นในตารางต้นไม้ได้ ต้องการ CTE โดยใช้ context.Table.SqlQuery ("select ... ") รุ่น / ฐานข้อมูลก่อนไม่มีข้อเสียเหล่านี้
Elisabeth

32
@davenewza นั่นเป็นเส้นทางแรกใช่มั้ย
Chris S

3
@davenewza ฐานข้อมูลที่มีอยู่ => คลาสที่มีอยู่หรือไม่ โค้ดแรก: ฐานข้อมูลแรก :)
riadh gomri

4
@davenewza ใช้ Powertools framework Entity เพื่อสร้างคลาส POCO ของคุณจาก DB รหัสแรกไปยังฐานข้อมูลที่มีอยู่
Iman Mahmoudinasab

50

ฐานข้อมูลแรกและรุ่นแรกไม่มีความแตกต่างที่แท้จริง สร้างรหัสเหมือนกันและคุณสามารถรวมวิธีการนี้ ตัวอย่างเช่นคุณสามารถสร้างฐานข้อมูลโดยใช้ตัวออกแบบได้มากกว่าที่คุณสามารถแก้ไขฐานข้อมูลโดยใช้สคริปต์ sql และอัปเดตโมเดลของคุณ

เมื่อคุณใช้รหัสในตอนแรกคุณจะไม่สามารถเปลี่ยนรูปแบบโดยไม่มีฐานข้อมูลนันทนาการและสูญเสียข้อมูลทั้งหมด IMHO ข้อ จำกัด นี้เข้มงวดมากและไม่อนุญาตให้ใช้รหัสในการผลิตครั้งแรก สำหรับตอนนี้มันไม่สามารถใช้งานได้อย่างแท้จริง

ข้อเสียเปรียบเล็กน้อยอันดับที่สองของรหัสแรกคือตัวสร้างแบบจำลองต้องการสิทธิ์ในฐานข้อมูลหลัก สิ่งนี้จะไม่ส่งผลกระทบต่อคุณหากคุณใช้ฐานข้อมูล SQL Server Compact หรือถ้าคุณควบคุมเซิร์ฟเวอร์ฐานข้อมูล

ข้อดีของรหัสแรกคือรหัสที่สะอาดและง่าย คุณสามารถควบคุมโค้ดนี้ได้อย่างสมบูรณ์และสามารถแก้ไขและใช้งานเป็นโมเดลมุมมองของคุณได้อย่างง่ายดาย

ฉันสามารถแนะนำให้ใช้รหัสวิธีแรกเมื่อคุณสร้างแอปพลิเคชันแบบสแตนด์อโลนอย่างง่ายโดยไม่ต้องกำหนดรุ่นและใช้ model \ database ก่อนในโครงการที่ต้องมีการดัดแปลงในการผลิต


7
หากคุณกำลังจะปรับปรุงสภาพแวดล้อมการผลิตด้วยตนเองด้วยสคริปต์ SQL คุณยังสามารถทำเช่นเดียวกันกับ Code First คุณเพียงแค่สร้างสคริปต์การเปลี่ยนแปลงตามความจำเป็น เครื่องมือต่าง ๆ สามารถทำการเดลต้าเหล่านี้โดยอัตโนมัติและคุณสามารถใช้รหัสก่อน คุณเพียงแค่ต้องเปลี่ยน Code initializer เป็น CreateDatabaseIfNotExists เพื่อไม่ให้ลบฐานข้อมูลปัจจุบัน
Esteban Brenes

ความแตกต่างบางอย่างกำลังนำเข้ามุมมองจากนั้นสร้างฐานข้อมูลใหม่ที่มุมมองกลายเป็นตาราง ทำให้ยากที่จะสร้างฐานข้อมูลใหม่และเปรียบเทียบกับฐานข้อมูลเพื่อดูว่ามีการซิงค์หรือไม่
เดฟ

Model First ไม่รองรับฟังก์ชั่น SQL ที่ผู้ใช้กำหนด (อย่างน้อยใน EF4 ไม่ทราบว่ามีการเปลี่ยนแปลงหรือไม่) ด้วยฐานข้อมูลก่อนคุณสามารถนำเข้า UDF และใช้ในการสืบค้น LINQ ของคุณ
Tsahi Asher

ไม่มีความแตกต่าง? ลองนำเข้ามุมมองและตาราง SimpleMembership จากนั้นสร้างฐานข้อมูลจากแบบจำลองและดูสิ่งที่คุณได้รับ ไม่ได้ใกล้เคียง! สิ่งเหล่านี้ควรเดินทางไปกลับ แต่ MSFT ได้ยกเลิก MF และ DF แทน CF ซึ่งโดยทั่วไปแล้วยังไม่สมบูรณ์ในแง่ของการใช้มุมมองและ procs ที่เก็บไว้
เดฟ

คุณสามารถปิดใช้งานรหัสกระบวนการโยกย้ายฐานนันทนาการครั้งแรกของรหัสและทำด้วยตนเองในรูปแบบและฐานข้อมูล คุณสามารถทำได้โดยการระบุ disableDatabaseInitialization = "true" ในเว็บ / app.config ที่ <EntityFramework> ..... <contexts> <context type = "myNamespace.mydbContext", "myassemblyORProject" disableDatabaseInitialization = "true" /> </EntityFramework> คุณสามารถลบโฟลเดอร์การย้ายข้อมูล
Hasteq

37

การอ้างอิงส่วนที่เกี่ยวข้องจากhttp://www.itworld.com/development/405005/3-reasons-use-code-first-design-entity-framework

3 เหตุผลในการใช้รหัสการออกแบบครั้งแรกกับ Entity Framework

1) cruft น้อยกว่า bloat น้อย

การใช้ฐานข้อมูลที่มีอยู่เพื่อสร้างไฟล์. edmx และโมเดลโค้ดที่เกี่ยวข้องจะส่งผลให้มีกองโค้ดขนาดใหญ่ที่สร้างขึ้นโดยอัตโนมัติ คุณจะไม่มีทางแตะต้องไฟล์ที่สร้างขึ้นเหล่านี้เพื่อมิให้ทำลายสิ่งใด ๆ หรือการเปลี่ยนแปลงของคุณจะถูกเขียนทับในรุ่นต่อไป บริบทและเครื่องมือเริ่มต้นติดขัดในระเบียบนี้เช่นกัน เมื่อคุณต้องการเพิ่มฟังก์ชันการทำงานให้กับโมเดลที่สร้างขึ้นของคุณเช่นคุณสมบัติแบบอ่านอย่างเดียวจากการคำนวณคุณต้องขยายคลาสโมเดล สิ่งนี้กลายเป็นข้อกำหนดสำหรับเกือบทุกรุ่นและคุณก็มีส่วนเสริมสำหรับทุกสิ่ง

ด้วยรหัสก่อนรุ่นของคุณมือรหัสกลายเป็นฐานข้อมูลของคุณ ไฟล์ที่แน่นอนที่คุณกำลังสร้างคือสิ่งที่สร้างการออกแบบฐานข้อมูล ไม่มีไฟล์เพิ่มเติมและไม่จำเป็นต้องสร้างส่วนขยายคลาสเมื่อคุณต้องการเพิ่มคุณสมบัติหรืออะไรก็ตามที่ฐานข้อมูลไม่จำเป็นต้องรู้ คุณสามารถเพิ่มลงในคลาสเดียวกันได้ตราบใดที่คุณทำตามไวยากรณ์ที่เหมาะสม เฮ้คุณสามารถสร้างไฟล์ Model.edmx เพื่อให้เห็นภาพรหัสของคุณได้ถ้าต้องการ

2) การควบคุมที่ดีกว่า

เมื่อคุณไปที่ DB ก่อนคุณจะอยู่ในความเมตตาของสิ่งที่สร้างขึ้นสำหรับแบบจำลองของคุณเพื่อใช้ในแอปพลิเคชันของคุณ บางครั้งการประชุมการตั้งชื่อไม่เป็นที่พึงปรารถนา บางครั้งความสัมพันธ์และการสมาคมไม่ได้เป็นอย่างที่คุณต้องการ เวลาอื่นที่ไม่ใช่ความสัมพันธ์ชั่วคราวกับการโหลดขี้เกียจสร้างความเสียหายในการตอบสนอง API ของคุณ

ในขณะที่มีวิธีแก้ปัญหาสำหรับการสร้างแบบจำลองที่คุณอาจพบเจออยู่เสมอการใช้รหัสก่อนจะช่วยให้คุณควบคุมได้อย่างสมบูรณ์และสมบูรณ์แบบตั้งแต่เริ่มต้น คุณสามารถควบคุมทุกแง่มุมของทั้งรหัสรุ่นและการออกแบบฐานข้อมูลของคุณจากความสะดวกสบายของวัตถุธุรกิจของคุณ คุณสามารถระบุความสัมพันธ์ข้อ จำกัด และการเชื่อมโยงได้อย่างแม่นยำ คุณสามารถตั้งค่าขีด จำกัด ของคุณสมบัติของอักขระและขนาดคอลัมน์ฐานข้อมูลได้พร้อมกัน คุณสามารถระบุได้ว่าจะโหลดคอลเลกชันที่เกี่ยวข้องใดหรือไม่เป็นอนุกรมเลย ในระยะสั้นคุณต้องรับผิดชอบต่อสิ่งต่าง ๆ เพิ่มขึ้น แต่คุณสามารถควบคุมการออกแบบแอพของคุณได้อย่างเต็มที่

3) การควบคุมเวอร์ชันของฐานข้อมูล

นี่เป็นเรื่องใหญ่ ฐานข้อมูลการกำหนดเวอร์ชันทำได้ยาก แต่ด้วยรหัสแรกและการโยกย้ายรหัสครั้งแรกจะมีประสิทธิภาพมากขึ้น เนื่องจากสคีมาฐานข้อมูลของคุณนั้นขึ้นอยู่กับรุ่นรหัสของคุณโดยรุ่นจะควบคุมซอร์สโค้ดของคุณซึ่งคุณกำลังช่วยในการสร้างฐานข้อมูลของคุณ คุณต้องรับผิดชอบในการควบคุมการกำหนดค่าเริ่มต้นบริบทซึ่งสามารถช่วยคุณทำสิ่งต่าง ๆ เช่นการแก้ไขข้อมูลธุรกิจแบบคงที่ คุณต้องรับผิดชอบในการสร้างรหัสการโยกย้ายครั้งแรก

เมื่อคุณเปิดใช้งานการย้ายข้อมูลครั้งแรกจะมีการสร้างคลาสการกำหนดค่าและการย้ายข้อมูลเริ่มต้น การโยกย้ายครั้งแรกคือสคีมาปัจจุบันของคุณหรือพื้นฐาน v1.0 ของคุณ จากจุดนั้นคุณจะต้องเพิ่มการย้ายข้อมูลซึ่งมีการประทับเวลาและติดป้ายกำกับด้วยตัวแสดงรายละเอียดเพื่อช่วยในการสั่งซื้อเวอร์ชัน เมื่อคุณเรียกใช้การย้ายข้อมูลจากตัวจัดการแพ็คเกจไฟล์การโยกย้ายใหม่จะถูกสร้างขึ้นซึ่งมีทุกอย่างที่มีการเปลี่ยนแปลงในรูปแบบรหัสของคุณโดยอัตโนมัติทั้งในฟังก์ชัน UP () และ DOWN () ฟังก์ชัน UP ใช้การเปลี่ยนแปลงกับฐานข้อมูลฟังก์ชั่น DOWN จะลบการเปลี่ยนแปลงเหล่านั้นในกรณีที่คุณต้องการย้อนกลับ ยิ่งไปกว่านั้นคุณสามารถแก้ไขไฟล์การโยกย้ายเหล่านี้เพื่อเพิ่มการเปลี่ยนแปลงเพิ่มเติมเช่นมุมมองใหม่ดัชนีขั้นตอนการจัดเก็บและสิ่งอื่น ๆ พวกเขาจะกลายเป็นระบบการกำหนดเวอร์ชันที่แท้จริงสำหรับสคีมาฐานข้อมูลของคุณ


31

รหัสแรกดูเหมือนจะเป็นดาวรุ่ง ฉันดู Ruby on Rails อย่างรวดเร็วและมาตรฐานของพวกเขาคือรหัสเป็นลำดับแรกด้วยการย้ายฐานข้อมูล

หากคุณกำลังสร้างแอปพลิเคชั่น MVC3 ฉันเชื่อว่า Code นั้นมีข้อดีดังต่อไปนี้:

  • การตกแต่งคุณสมบัติที่ง่าย - คุณสามารถตกแต่งฟิลด์ด้วยการตรวจสอบความต้องการและคุณสมบัติอื่น ๆ มันค่อนข้างงุ่มง่ามกับการสร้างแบบจำลองของ EF
  • ไม่มีข้อผิดพลาดในการสร้างแบบจำลองแปลกประหลาด - การสร้างแบบจำลองของ EF มักจะมีข้อผิดพลาดแปลก ๆ เช่นเมื่อคุณพยายามที่จะเปลี่ยนชื่อคุณสมบัติการเชื่อมโยงมันจะต้องตรงกับเมตาดาต้าพื้นฐาน - ซึ่งไม่ยืดหยุ่นมาก
  • ไม่น่าแปลกใจที่จะผสาน - เมื่อใช้เครื่องมือควบคุมเวอร์ชันของรหัสเช่น Mercurial การรวมไฟล์. edmx เป็นความเจ็บปวด คุณเป็นโปรแกรมเมอร์ที่ใช้ใน C # และคุณได้รวม. edmx ไม่เช่นนั้นด้วยรหัสแรก
  • เปรียบเทียบกลับไปที่ Code ก่อนและคุณสามารถควบคุมได้อย่างสมบูรณ์โดยไม่มีความซับซ้อนที่ซ่อนอยู่และสิ่งที่ไม่รู้จักที่จะจัดการ
  • ฉันขอแนะนำให้คุณใช้เครื่องมือบรรทัดคำสั่งของตัวจัดการแพคเกจอย่าใช้เครื่องมือกราฟิกเพื่อเพิ่มตัวควบคุมใหม่เพื่อดูมุมมอง
  • DB-Migrations - จากนั้นคุณยังสามารถ Enable-Migrations มันมีพลังมาก คุณทำการเปลี่ยนแปลงโมเดลของคุณในโค้ดจากนั้นเฟรมเวิร์กสามารถติดตามการเปลี่ยนแปลงสกีมาดังนั้นคุณสามารถปรับใช้การอัพเกรดได้อย่างราบรื่นด้วยสกีมาเวอร์ชันที่อัปเกรดโดยอัตโนมัติ (และปรับลดรุ่นหากจำเป็น) (ไม่แน่ใจ แต่สิ่งนี้อาจใช้ได้กับรุ่นแรกด้วย)

ปรับปรุง

คำถามยังถามถึงการเปรียบเทียบ code-first กับ EDMX model / db-first โค้ดแรกสามารถใช้สำหรับทั้งสองวิธีดังกล่าวด้วย:


3
รุ่นแรกไม่ได้เขียนโค้ด POCO ก่อนนี่คือรหัสแรกรุ่นแรกคือ Visual Designer เพื่อสร้าง POCO แบบอัตโนมัติและหลังจากนั้นก็สร้างฐานข้อมูลจากรุ่น
Diego Mendes

วันนี้ทั้งในเส้นทางภาพและรหัสคุณสามารถทำ "รุ่น" ก่อนหรือ "ฐานข้อมูล" ก่อน ประการแรกคือการออกแบบด้วยตนเอง (ผ่านรหัสหรือโปรแกรมแก้ไขภาพ) ที่สองคือการสร้างฐานข้อมูลและการสร้างแบบจำลอง (ทั้ง POCO หรือ EDMX)
ทอดด์

11

ฉันใช้ฐานข้อมูลของ EF เป็นลำดับแรกเพื่อเพิ่มความยืดหยุ่นและควบคุมการกำหนดค่าฐานข้อมูล

รหัส EF เป็นครั้งแรกและรุ่นแรกดูดีในตอนแรกและให้ความเป็นอิสระของฐานข้อมูลอย่างไรก็ตามในการทำเช่นนี้มันไม่อนุญาตให้คุณระบุสิ่งที่ฉันพิจารณาข้อมูลการกำหนดค่าฐานข้อมูลพื้นฐานและพื้นฐานทั่วไป ตัวอย่างเช่นดัชนีตารางเมตาดาต้าความปลอดภัยหรือมีคีย์หลักที่มีมากกว่าหนึ่งคอลัมน์ ฉันพบว่าฉันต้องการใช้คุณสมบัติฐานข้อมูลเหล่านี้และทั่วไปอื่น ๆ และดังนั้นจึงต้องทำการกำหนดค่าฐานข้อมูลบางอย่างโดยตรง

ฉันพบว่าคลาส POCO เริ่มต้นที่สร้างขึ้นในช่วงแรกนั้นสะอาดมาก แต่ไม่มีแอตทริบิวต์คำอธิบายประกอบข้อมูลที่เป็นประโยชน์มากหรือการแมปกับโพรซีเดอร์ที่เก็บไว้ ฉันใช้เทมเพลต T4 เพื่อเอาชนะข้อ จำกัด เหล่านี้ เทมเพลต T4 นั้นยอดเยี่ยมโดยเฉพาะเมื่อรวมกับข้อมูลเมตาของคุณและคลาสบางส่วน

รุ่นแรกดูเหมือนจะมีศักยภาพมากมาย แต่ให้ข้อบกพร่องมากมายแก่ฉันในระหว่างการสร้างโครงสร้างฐานข้อมูลที่ซับซ้อน ไม่แน่ใจว่าทำไม


4
คุณสามารถกำหนดคีย์ผสมโดยใช้รหัสก่อน - stackoverflow.com/questions/5466374/…
Jakub Konecki

3
สำหรับผู้อ่านในอนาคตนี่ไม่ใช่กรณีอีกต่อไปคุณสามารถเพิ่มดัชนีคีย์หลักหลายคอลัมน์และสิ่งต่าง ๆ นี้ในรหัส EF First
tobiak777

1
EF ควรได้รับการแก้ไขเพื่อให้ทั้ง 3 วิธีสามารถใช้แทนกันได้ในฐานข้อมูลเดียวกันเนื่องจากมีข้อดีและข้อเสียสำหรับวิธีการทั้ง 3 วิธี
Dave

นอกจากนี้ความจริงของรหัสที่ไม่เหมาะกับการแก้ปัญหาครั้งแรกฉันใช้ฐานข้อมูลเป็นอันดับแรกเนื่องจากการโยกย้ายไปยัง IDE / ภาษาอื่น ๆ ในอนาคตและฉันต้องการที่จะมีความมั่นคงและบูรณาการโครงสร้างฐานข้อมูลจริง ๆ แล้วฉันชอบฐานข้อมูล การจัดเก็บข้อมูล
QMaster

7

การทำงานกับรุ่นใหญ่ช้ามากก่อน SP1 (ยังไม่ได้ลองหลังจาก SP1 แต่มีการกล่าวว่าเป็น snap ทันที)

ฉันยังคงออกแบบตารางของฉันก่อนจากนั้นเครื่องมือที่สร้างขึ้นภายในจะสร้าง POCO ให้ฉันดังนั้นจึงต้องใช้ภาระในการทำภารกิจซ้ำ ๆ สำหรับวัตถุ poco แต่ละตัว

เมื่อคุณใช้ระบบควบคุมแหล่งข้อมูลคุณสามารถติดตามประวัติของ POCO ของคุณได้อย่างง่ายดายมันไม่ง่ายนักหากใช้รหัสที่นักออกแบบสร้างขึ้น

ฉันมีฐานสำหรับ POCO ของฉันซึ่งทำให้สิ่งต่าง ๆ เป็นเรื่องง่ายมาก

ฉันมีมุมมองสำหรับตารางทั้งหมดของฉันแต่ละมุมมองพื้นฐานนำข้อมูลพื้นฐานสำหรับคีย์ต่างประเทศของฉันและมุมมองของฉัน POCO มาจากชั้นเรียน POCO ของฉันซึ่งค่อนข้างมีประโยชน์อีกครั้ง

และในที่สุดฉันก็ไม่ชอบนักออกแบบ


8
'เมื่อคุณใช้ระบบควบคุมแหล่งข้อมูลคุณสามารถติดตามประวัติของ POCO ของคุณได้อย่างง่ายดายมันไม่ง่ายเลยหากใช้รหัสที่นักออกแบบสร้างขึ้น' - ฉันเก็บรหัสที่สร้างโดยนักออกแบบในการควบคุมซอร์สดังนั้นฉันสามารถดูประวัติได้ตลอดเวลา
Jakub Konecki

1
@JakubKonecki คุณเคยพยายามรวมไฟล์ EDMX ไว้ในทีม 3 คนหรือไม่? เป็นเพียงความเจ็บปวด ... แทนที่จะให้คนพยายามหลีกเลี่ยงการรวมและใช้การแก้ไขอื่น ๆ และทำซ้ำการเปลี่ยนแปลงของตนเองเนื่องจากการผสานนั้นมักจะล้มเหลวในไฟล์ที่สร้างโดยอัตโนมัติด้วย XML หลายพันบรรทัด
bytecode77

6

ตัวอย่างวิธีการฐานข้อมูลแรก:

โดยไม่ต้องเขียนโค้ดใด ๆ : ฐานข้อมูล ASP.NET MVC / MVC3 วิธีแรก / ฐานข้อมูลก่อน

และฉันคิดว่ามันจะดีกว่าวิธีอื่น ๆ เพราะการสูญเสียข้อมูลน้อยกว่าด้วยวิธีนี้


คุณสามารถอธิบายอย่างละเอียดว่ามี 'การสูญเสียข้อมูลน้อยลง' ด้วยวิธีการแรกของ DB หรือไม่ คุณจะทำการแปลงข้อมูลอย่างไรถ้าคุณแบ่งตารางที่มีอยู่ออกเป็นสองส่วน
Jakub Konecki

คุณอาจจะเขียนสคริปต์ sql ที่ดูแลการเปลี่ยนแปลง โดยทั่วไป MS ประกาศว่าจะปรับปรุงการโยกย้ายข้อมูลของ Code First ด้วยเวอร์ชันใหม่ดังนั้นนี่อาจไม่ใช่ข้อโต้แย้งในอนาคต
ckonig

ปัญหาเกี่ยวกับฐานข้อมูลก่อนคือการออกแบบฐานข้อมูลโดยทั่วไปมี abstractions ที่ผิดพลาดซึ่งรั่วไหลลงในโมเดลของคุณ ... ตารางแยก ฯลฯ งานของฐานข้อมูลคือการคงรูปแบบของคุณไว้
Nerdfest

"คำตอบ" นี้เป็นความเห็นที่ไม่มีเนื้อความกับการโต้แย้งของคุณหนึ่งประโยคไม่ได้ทำให้ท่าทาง
TravisO

คุณสามารถอธิบายอย่างละเอียดว่ามี 'ข้อมูลสูญหายน้อยลง' ด้วยวิธีแรกของ DB หรือไม่
amal50

4

IMHO ฉันคิดว่าทุกรุ่นมีสถานที่ที่ยอดเยี่ยม แต่ปัญหาที่ฉันมีกับแนวทางแรกคือในธุรกิจขนาดใหญ่หลายแห่งที่มีการควบคุมฐานข้อมูลของ DBA คุณไม่ได้รับความยืดหยุ่นในการสร้างแอพพลิเคชั่น ฉันทำงานหลายโครงการและเมื่อต้องใช้งานพวกเขาต้องการการควบคุมอย่างเต็มที่

ดังนั้นเท่าที่ฉันเห็นด้วยกับรูปแบบทั้งหมดที่เป็นไปได้รหัสแรกรุ่นแรกฐานข้อมูลก่อนคุณต้องพิจารณาสภาพแวดล้อมการผลิตจริง ดังนั้นหากระบบของคุณจะเป็นแอพพลิเคชั่นฐานผู้ใช้ขนาดใหญ่ที่มีผู้ใช้จำนวนมากและ DBA กำลังรันการแสดงคุณอาจพิจารณาตัวเลือกฐานข้อมูลเป็นเพียงความเห็นของฉัน


คุณพูดถูก MS ให้วิธีเขียนโปรแกรมที่แตกต่างกัน คุณควรรู้ทั้งหมดและตัดสินใจตามสถานการณ์ที่ดีที่สุดสำหรับโครงการและสิ่งที่คุณชอบมากที่สุด
สเตอร์ลิง Diaz

0

ฉันคิดว่าหนึ่งในข้อดีของรหัสคือคุณสามารถสำรองการเปลี่ยนแปลงทั้งหมดที่คุณทำกับระบบควบคุมเวอร์ชันเช่น Git เนื่องจากตารางและความสัมพันธ์ทั้งหมดของคุณจะถูกเก็บไว้ในสิ่งที่เป็นเพียงแค่คลาสคุณสามารถย้อนเวลากลับไปและดูว่าโครงสร้างของฐานข้อมูลของคุณมาก่อน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.