ฉันจะอัปเดต Linq เป็นไฟล์ SQL dbml ได้อย่างไร


คำตอบ:


259

มีสามวิธีในการซิงค์โมเดล

  1. ลบตารางที่แก้ไขจากตัวออกแบบและลากกลับไปที่พื้นผิวของนักออกแบบจาก Database Explorer ฉันพบว่าเพื่อให้สิ่งนี้ทำงานได้อย่างน่าเชื่อถือคุณต้อง:

    ก. รีเฟรชสคีมาฐานข้อมูลใน Database Explorer (คลิกขวารีเฟรช)
    b. บันทึกตัวออกแบบหลังจากลบตาราง
    c. บันทึกอีกครั้งหลังจากลากตารางกลับ

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

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

  3. ทำการเปลี่ยนแปลงโดยตรงในบานหน้าต่างคุณสมบัติของ DBML สิ่งนี้ใช้ได้กับการเปลี่ยนแปลงง่ายๆเช่นการอนุญาตค่าว่างในฟิลด์

ตัวออกแบบ DBML ไม่ได้ติดตั้งตามค่าเริ่มต้นใน Visual Studio 2015, 2017 หรือ 2019 คุณจะต้องปิด VS เริ่มโปรแกรมติดตั้ง VS และแก้ไขการติดตั้งของคุณ เครื่องมือLINQ to SQLเป็นคุณลักษณะที่คุณต้องติดตั้ง สำหรับ VS 2017/2019 คุณสามารถค้นหาได้ภายใต้ส่วนบุคคล> รหัสเครื่องมือ


1
ฉันได้ลอง 1a และ 1c โดยไม่มี 1b และได้รับข้อผิดพลาด 'ระบุไม่ถูกต้อง' เมื่อทำการเลือกอย่างง่ายบนมุมมอง รวม 1b แก้ไขให้ฉัน
tomfumb

6
สนับสนุน VS ได้รับการร้องขอในconnect.microsoft.com/VisualStudio/feedback/details/260723/...แต่ MS ไม่ต้องการที่จะแก้ไข
Michael Freidgeim

ลองวิธีแรกแล้วได้ผล เดาว่าจะใช้ได้กับ DB ขนาดเล็ก
Muhammedh

ฉันเจ็บปวดที่ปลายปี 2019 ฉันต้องการคำตอบที่สร้างขึ้นก่อนที่ฉันจะรู้ว่าการเขียนโปรแกรมคอมพิวเตอร์คืออะไร ... นี่เป็นรายละเอียดและยอดเยี่ยมมาก!
PSGuy

57

ในการอัปเดตตารางใน. dbml-diagram ของคุณด้วยตัวอย่างเช่นคอลัมน์ที่เพิ่มเข้ามาให้ดำเนินการดังนี้:

  1. อัปเดตหน้าต่าง SQL Server Explorer ของคุณ
  2. ลากตารางเวอร์ชัน "ใหม่" ลงใน. dbml-diagram (report1 ในภาพด้านล่าง)

report1 เป็นเวอร์ชันใหม่ของตาราง

  1. ทำเครื่องหมายคอลัมน์ที่เพิ่มในตารางเวอร์ชันใหม่กดCtrl+ Cเพื่อคัดลอกคอลัมน์ที่เพิ่ม

คัดลอกคอลัมน์ที่เพิ่ม

  1. คลิกตารางเวอร์ชัน "เก่า" แล้วกดCtrl+ Vเพื่อวางคอลัมน์ที่เพิ่มลงในตารางเวอร์ชันปัจจุบันแล้ว

วางคอลัมน์ที่เพิ่มลงในตารางเวอร์ชันเก่า


4
นี่ดูเหมือนจะเป็นวิธีที่ง่ายที่สุดและทำลายล้างน้อยที่สุดโดยไม่ต้องใช้เครื่องมือพิเศษใด ๆ และใช้ได้ผลดีใน VS2017
Toby

1
นี่เป็นการล่วงล้ำน้อยกว่าคำตอบที่ได้รับการยอมรับมากและยังคงใช้งานได้ดีในช่วงปลายปี 2018!
มาร์ค

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

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

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

5

นอกจากนี้คุณยังสามารถตรวจสอบชุดเทมเพลตการสร้างโค้ดของPLINQOโดยใช้ CodeSmith ซึ่งช่วยให้คุณสามารถทำสิ่งต่างๆมากมายสำหรับ Linq-to-SQL:

  • สร้างหนึ่งไฟล์ต่อคลาส (แทนที่จะเป็นไฟล์เดียวขนาดใหญ่)
  • อัปเดตโมเดลของคุณตามต้องการ
  • คุณสมบัติอื่น ๆ อีกมากมาย

ตรวจสอบเว็บไซต์ PLINQO ที่ http://www.plinqo.com และดูวิดีโอแนะนำ

เครื่องมือที่สองที่ฉันรู้จักคือเครื่องมือHuagati DBML / EDMXซึ่งอนุญาตให้อัปเดตไฟล์การแมป DBML (Linq-to-SQL) และ EDMX (Entity Framework) และอื่น ๆ (เช่นหลักการตั้งชื่อเป็นต้น)

มาร์ค


มีการฉีกขาดเพียงแค่ออก CodeSmith / PLINQO ผมขอแนะนำให้กับการใช้วิธีนี้ ได้รับคำตอบนี้คืออายุมากกว่า 4 ปี ...
Yuck

@Yuck: ณ เวลานี้ฉันไม่แนะนำให้ใช้ Linq-to-SQL เลย - ใช้ Entity Framework แทนทางเลือกที่ดีกว่ามาก!
marc_s

ใช่แล้ว. การย้ายไปยัง EF หลังจากตรวจสอบแล้วว่าแอปพลิเคชันสามารถทำงานกับ DBML ธรรมดาแทน PLINQO เป็นขั้นตอนต่อไปที่ฉันได้ดำเนินการในการปัดฝุ่นแอปพลิเคชันเก่า
Yuck

4

เราใช้เทมเพลต T4 ที่เขียนขึ้นเองซึ่งจะสืบค้นโมเดล information_schema แบบไดนามิกสำหรับแต่ละตารางในไฟล์. DBML ทั้งหมดของเราจากนั้นเขียนทับบางส่วนของไฟล์. DBML ด้วยข้อมูลสคีมาใหม่จากฐานข้อมูล ฉันสูงแนะนำให้ใช้วิธีแก้ปัญหาเช่นนี้ซึ่งช่วยให้ฉันประหยัดเวลาได้มากและไม่เหมือนกับการลบและเพิ่มตารางของคุณใหม่ในแบบจำลองของคุณที่คุณจะได้รับเพื่อคงความเชื่อมโยงไว้ ด้วยโซลูชันนี้คุณจะได้รับข้อผิดพลาดเวลาคอมไพล์เมื่อสคีมาของคุณเปลี่ยนแปลง คุณต้องการตรวจสอบให้แน่ใจว่าคุณกำลังใช้ระบบควบคุมเวอร์ชันเนื่องจากความแตกต่างนั้นมีประโยชน์มาก นี่เป็นโซลูชันที่ยอดเยี่ยมที่ใช้งานได้ดีหากคุณกำลังพัฒนาด้วย DB schema แนวทางแรก แน่นอนว่าฉันไม่สามารถแบ่งปันรหัส บริษัท ของฉันได้ดังนั้นคุณจึงเป็นคนเขียนเอง แต่ถ้าคุณรู้จัก Linq-to-XML และสามารถไปโรงเรียนในโครงการนี้ได้คุณจะไปถึงที่ที่คุณต้องการได้


2

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


4
ใช่ แต่นักออกแบบภาพใน VS2008 ไม่สามารถตรวจจับและตอบสนองต่อการเปลี่ยนแปลงในฐานข้อมูลพื้นฐานของคุณ :-( ขาดการลบและเพิ่มใหม่ไม่มีการสนับสนุนในการอัปเดตโมเดลของคุณ :-(
marc_s

แม้ว่าจะเป็นเรื่องจริง แต่คำถามก็คลุมเครือมากและไม่ได้กล่าวถึงวิธีการอัปเดตโมเดลเมื่อฐานข้อมูลมีการเปลี่ยนแปลง
Jason Miesionczek

2

มีความแตกต่างเล็กน้อยในการอัปเดตตารางจากนั้นอัปเดต DBML ... ความสัมพันธ์ของ Foreign Key จะไม่ถูกนำมาใช้ในทันทีหากมีการเปลี่ยนแปลงตารางที่มีอยู่ วิธีแก้ปัญหาคือการสร้างโครงการแล้วเพิ่มตารางอีกครั้ง ฉันรายงานเรื่องนี้ไปยัง MS และได้รับการแก้ไขสำหรับ VS2010

การแสดง DBML ไม่แสดงข้อ จำกัด ของ Foreign Key ใหม่


โปรดทราบว่าคำแนะนำในคำตอบหลักไม่ชัดเจน เพื่อปรับปรุงตาราง

  1. เปิดพื้นผิวการออกแบบ dbml
  2. เลือกตารางทั้งหมดด้วยขวา -> คลิก -> เลือกทั้งหมดหรือ CTRLa
  3. CTRLx (ตัด)
  4. CTRLv (วาง)
  5. บันทึกและสร้างโซลูชันใหม่

ฉันไม่เชื่อว่ามันคงที่เพราะconnect.microsoft.com/VisualStudio/feedback/details/414601/…ที่เกี่ยวข้องไม่ได้รับการแก้ไข
Michael Freidgeim

คุณทำการเปลี่ยนแปลงก่อนหรือหลังตัดและวาง?
Kolob Canyon

เป็นเวลา 10 ปีแล้ว ... แต่ฉันเชื่อว่าก่อนหน้านี้ ... ทำการเปลี่ยนแปลงแล้วไปที่ # 2
ΩmegaMan

1

ในกรณีของการอัพเดตกระบวนงานที่เก็บไว้คุณควรลบออกจากไฟล์. dbml และใส่เข้าไปใหม่อีกครั้ง แต่ถ้ากระบวนงานที่จัดเก็บมีสองเส้นทาง (เช่นถ้ามีบางอย่างแสดงคอลัมน์อื่นแสดงคอลัมน์อื่น) ตรวจสอบให้แน่ใจว่าทั้งสองพา ธ มีนามแฝงคอลัมน์เดียวกัน !!! มิฉะนั้นจะมีเฉพาะคอลัมน์พา ธ แรกเท่านั้น


0

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

คุณต้องทำการเปลี่ยนแปลงพื้นผิวการออกแบบของคุณตามที่แนะนำไว้ข้างต้น อย่างไรก็ตามคุณต้องทำขั้นตอนเพิ่มเติม นี่คือขั้นตอนทั้งหมด:

  1. ลากตารางที่อัปเดตของคุณจาก Server Explorer ไปยังพื้นผิวการออกแบบ

  2. คัดลอกคอลัมน์ใหม่จากตาราง "ใหม่" นี้ไปยังตาราง "เก่า" (ดูคำตอบของ M463 สำหรับรายละเอียดเกี่ยวกับขั้นตอนนี้)

  3. ลบตาราง "ใหม่" ที่คุณเพิ่งลากไป

  4. คลิกและไฮไลต์กระบวนงานที่จัดเก็บจากนั้นลบออก

  5. ลากกระบวนงานที่จัดเก็บใหม่แล้ววางลงในตำแหน่ง

  6. ลบไฟล์ .designer.vb ใน code-behind ของ. dbml (หากคุณไม่ลบสิ่งนี้โค้ดของคุณที่อยู่เบื้องหลังสคีมาจะไม่อัปเดตแม้ว่าคุณจะสร้างใหม่และจะไม่รวมฟิลด์ตารางใหม่)

  7. ทำความสะอาดและสร้างโซลูชันใหม่ (ซึ่งจะสร้างไฟล์. designer.vb ใหม่เพื่อรวมการเปลี่ยนแปลงใหม่ทั้งหมด!)

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