อะไรคือความแตกต่างระหว่างรายการชุดและกระเป๋าในไฟล์การแมป NHibernate แต่ละรายการเกี่ยวข้องกับคอลเลกชัน. NET อย่างไร
อะไรคือความแตกต่างระหว่างรายการชุดและกระเป๋าในไฟล์การแมป NHibernate แต่ละรายการเกี่ยวข้องกับคอลเลกชัน. NET อย่างไร
คำตอบ:
ความหมายของ NHibernate:
รายการ: สั่งซื้อคอลเลกชันของเอนทิตีอนุญาตให้ทำซ้ำ ใช้. NET IList
ในรหัส คอลัมน์ดัชนีจะต้องถูกแมปใน NHibernate
ชุด: คอลเลกชันที่ไม่ได้เรียงลำดับของเอนทิตีที่ไม่ซ้ำกันไม่อนุญาตให้ทำซ้ำ ใช้Iesi.Collection.ISet
ในโค้ด (NH ก่อน v4) หรือSystem.Collections.Generic.ISet
(NH v4 +) เป็นสิ่งสำคัญในการลบล้างGetHashCode
และEquals
ระบุนิยามธุรกิจของรายการที่ซ้ำกัน สามารถจัดเรียงโดยการกำหนด orderby หรือโดยการกำหนดตัวเปรียบเทียบที่ทำให้เกิดSortedSet
ผลลัพธ์
กระเป๋า: รายการเอนทิตีที่ไม่เรียงลำดับอนุญาตให้ทำซ้ำได้ ใช้. NET ICollection<T>
ในรหัส คอลัมน์ดัชนีของรายการไม่ได้ถูกแมปและไม่ได้รับเกียรติจาก NHibernate
วัตถุเหล่านี้ทั้งหมดใน NHibernate เหมือนกับการใช้งานอื่น ๆ ของ Abstract Data types (ADT) ฉันแปลกใจว่าการหาชุดและกระเป๋าออนไลน์เป็นเรื่องยากแค่ไหนเพราะชื่อธรรมดาสำหรับสิ่งอื่น ๆ ดังนั้นฉันจึงได้ระบุลิงค์และคำอธิบายไว้ที่นี่
สำหรับรายละเอียดเพิ่มเติมดูที่ต่อไปนี้: รายการ , ชุดและ กระเป๋า
กฎทั่วไปคือ:
รายการจะเรียงลำดับตามค่าเริ่มต้นให้ใช้สิ่งเหล่านี้หากคุณต้องการดึงวัตถุออกมาด้วยดัชนีของมันหรือคุณชอบfor
ห่วงแปลก ๆมากกว่าforeach
ลูป คุณไม่จำเป็นต้องเข้าถึงพวกเขาในการสั่งซื้อเช่นคุณจะต้องอยู่ในรายการที่เชื่อมโยง ADT นี้อนุญาตให้ทำซ้ำ
โปรดทราบ! แม้ว่ารายการจะเรียงลำดับตามที่ BryanD กล่าวไว้ในคำตอบของเขาแต่ก็ไม่มีอะไรบอกได้ว่าจะต้องเป็นไปตามลำดับที่คุณคาดหวังจากฐานข้อมูลเมื่อคุณดำเนินการสืบค้น HQL เว้นแต่คุณจะระบุคำสั่งตามคำสั่ง เป็นเพราะเหตุนี้บางคนจึงชอบใช้ Set หรือ Bags แทนเพื่อที่จะไม่ให้ภาพลวงตาของการสั่งซื้อ แม้ว่าฉันจะพูดแบบนี้ แต่ส่วนใหญ่แล้วพวกมันจะอยู่ในลำดับที่มองเห็นได้เนื่องจากมีการเพิ่มลงในรายการตามลำดับที่พบในข้อความค้นหาที่ NHibernate เรียกใช้
ชุดจะไม่ได้โดยเริ่มต้นสั่งคุณไม่สามารถเข้าถึงตัวแปรใด ๆ ได้โดยตรงผ่านทางดัชนี โดยค่าเริ่มต้นชุดจะเป็นADT เพียงรายการเดียวจากสามรายการข้างต้นซึ่งคงความเป็นเอกลักษณ์ของวัตถุไว้ สิ่งเหล่านี้ดีมากหากคุณมีคอลเล็กชันหากคุณต้องการให้ไม่มีรายการที่ซ้ำกัน
กระเป๋า (หรือมัลติ ) เป็นตามที่คุณสามารถดูได้จากลิงก์ด้านบนประเภทของชุดที่ไม่ให้วัตถุที่อยู่ภายในจะเป็นรายการที่ซ้ำกันของวัตถุอื่น ๆ โดยทั่วไปจะไม่ใช้สิ่งเหล่านี้เนื่องจากการสั่งซื้อ Lists สามารถละเว้นได้และด้วยเหตุนี้จึงถือว่าเป็นกระเป๋า
เกี่ยวกับวิธีใช้สิ่งเหล่านี้ใน NHibernate ไม่มีสิ่งใดถูกดึงออกจากฐานข้อมูลแตกต่างกันไปขึ้นอยู่กับ ADT ที่คุณเลือกที่นี่เป็นสิ่งที่คุณต้องการใช้เพื่อที่จะทำให้คุณเลือก ADT ที่แตกต่างกัน
โดยส่วนตัวแล้วฉันใช้ชุดสำหรับสิ่งต่างๆเป็นส่วนใหญ่เนื่องจากโดยทั่วไปฉันต้องการให้วัตถุลูกไม่ซ้ำกันและการสั่งซื้อไม่ใช่ปัญหา แม้ว่าฉันจะใช้รายการที่ฉันมีกลุ่มของวัตถุที่ฉันต้องการเรียงลำดับตามบางสิ่งบางอย่างเช่นเวลาเพื่อให้บรรลุคำสั่งนี้ฉันต้องตั้งค่า "เรียงตาม" ด้วยตนเองในแบบสอบถาม HQL
ความแตกต่างหลักคือรายการมีลำดับโดยนัยไปยังองค์ประกอบซึ่งจัดทำดัชนีตามตำแหน่งในรายการ ชุดและกระเป๋าอาจ "สั่งซื้อ" โดยปกติโดยผู้เปรียบเทียบหรือสั่งซื้อตามอนุประโยคที่ใช้เมื่อสิ่งของเหล่านั้นออกมาจากฐานข้อมูล โดยส่วนตัวฉันไม่เคยใช้กระเป๋า ... ถ้าฉันรู้ว่าข้อมูลที่ฉันต้องการถูกเรียงลำดับตามลำดับฉันใช้รายการไม่งั้นฉันก็ใช้ Set
การตั้งค่าไม่อนุญาตให้คุณมีองค์ประกอบซ้ำ ๆ ในนั้น หากคุณจะลองเพิ่มองค์ประกอบใหม่มันจะเปรียบเทียบ (ใช้วิธีการเท่ากับ) แต่ละองค์ประกอบที่มีอยู่แล้วในคอลเลกชันกับองค์ประกอบที่คุณเพิ่มและหากมีการเรียกคืนจริงองค์ประกอบจะไม่ถูกเพิ่ม
ISet
แทนIesi
ไม่ได้หรือ?