รายการเทียบกับชุดเทียบกับกระเป๋าใน NHibernate


109

อะไรคือความแตกต่างระหว่างรายการชุดและกระเป๋าในไฟล์การแมป NHibernate แต่ละรายการเกี่ยวข้องกับคอลเลกชัน. NET อย่างไร

คำตอบ:


230

ความหมายของ NHibernate:

  1. รายการ: สั่งซื้อคอลเลกชันของเอนทิตีอนุญาตให้ทำซ้ำ ใช้. NET IListในรหัส คอลัมน์ดัชนีจะต้องถูกแมปใน NHibernate

  2. ชุด: คอลเลกชันที่ไม่ได้เรียงลำดับของเอนทิตีที่ไม่ซ้ำกันไม่อนุญาตให้ทำซ้ำ ใช้Iesi.Collection.ISetในโค้ด (NH ก่อน v4) หรือSystem.Collections.Generic.ISet(NH v4 +) เป็นสิ่งสำคัญในการลบล้างGetHashCodeและEqualsระบุนิยามธุรกิจของรายการที่ซ้ำกัน สามารถจัดเรียงโดยการกำหนด orderby หรือโดยการกำหนดตัวเปรียบเทียบที่ทำให้เกิดSortedSetผลลัพธ์

  3. กระเป๋า: รายการเอนทิตีที่ไม่เรียงลำดับอนุญาตให้ทำซ้ำได้ ใช้. NET ICollection<T>ในรหัส คอลัมน์ดัชนีของรายการไม่ได้ถูกแมปและไม่ได้รับเกียรติจาก NHibernate


Re: # 2 เราใช้แค่ Regular ISetแทนIesiไม่ได้หรือ?
Sergei Tachenov

@SergeyTachenov: ดูstackoverflow.com/questions/9222058/…สำหรับคำตอบที่เป็นไปได้ เมื่อคำตอบนี้ถูกเขียน ISet ไม่ใช่ส่วนหนึ่งของ. net
Michael Gattuso

คำตอบที่ได้รับความนิยมน้อยที่สุดสำหรับคำถามนั้นคือใช่เนื่องจาก NHibernate 4 ดังนั้นคำถามนี้อาจต้องได้รับการแก้ไขด้วย
Sergei Tachenov

21

วัตถุเหล่านี้ทั้งหมดใน NHibernate เหมือนกับการใช้งานอื่น ๆ ของ Abstract Data types (ADT) ฉันแปลกใจว่าการหาชุดและกระเป๋าออนไลน์เป็นเรื่องยากแค่ไหนเพราะชื่อธรรมดาสำหรับสิ่งอื่น ๆ ดังนั้นฉันจึงได้ระบุลิงค์และคำอธิบายไว้ที่นี่

สำหรับรายละเอียดเพิ่มเติมดูที่ต่อไปนี้: รายการ , ชุดและ กระเป๋า

กฎทั่วไปคือ:

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

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

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

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

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

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


2
การแก้ไขรายการ - การใช้รายการในไฟล์การแมป NHibernate จะต้องมีการแมปคอลัมน์ดัชนี วิธีนี้รายการจะถูกดึงออกมาตามลำดับที่ถูกใส่ไว้
Michael Gattuso

@ Michael Gattuso จุดดีฉันควรจะพูดถึงในคำตอบข้างต้นว่าฉันกำลังพูดถึงการสืบค้น HQL (ดังนั้นความคิดเห็น 'เรียงตาม') แทนที่จะเป็นข้อกำหนดการรวบรวมจริงในไฟล์การแมปของคุณ
เจ

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

1

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


0

การตั้งค่าไม่อนุญาตให้คุณมีองค์ประกอบซ้ำ ๆ ในนั้น หากคุณจะลองเพิ่มองค์ประกอบใหม่มันจะเปรียบเทียบ (ใช้วิธีการเท่ากับ) แต่ละองค์ประกอบที่มีอยู่แล้วในคอลเลกชันกับองค์ประกอบที่คุณเพิ่มและหากมีการเรียกคืนจริงองค์ประกอบจะไม่ถูกเพิ่ม

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