จะแมปคอลัมน์คีย์ต่างประเทศใน nhibernate ได้อย่างไร

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

public class Post
{
    public virtual long Id { get; set; };
    public virtual string Content { get; set; };
    public virtual long CategoryId { get; set; };
    public virtual Category Category { get; set; };
}

ฉันไม่ต้องการตั้งค่าคุณสมบัติหมวดหมู่เมื่อฉันพยายามบันทึกเอนทิตี Post ดังตัวอย่างด้านล่าง

Post post = new Post { Content = "content", Category = aCategoryEntity };
session.Save(post);

ตัวอย่างด้านล่างนี้เป็นวิธีที่ฉันต้องการนำไปใช้

Post post = new Post { Content = "content", CategoryId = 3 };
session.Save(post);

ฉันจะกำจัดสิ่งนั้นได้อย่างไร?


person Ali Ersöz    schedule 21.05.2009    source แหล่งที่มา
comment
หากคุณยังคงติดขัด ทำไมไม่โพสต์แผนที่ของคุณด้วย   -  person Mark Dickinson    schedule 21.05.2009


คำตอบ (3)


Session.Load เป็นโซลูชันที่ฉันเคยใช้ที่นี่

Post post = new Post 
{ 
   Content = "content", 
   Category = Session.Load<Category>(categoryId)
};

session.Save(post);
person Ali Ersöz    schedule 30.12.2009

เอนทิตี "โพสต์" ของคุณไม่ต้องการทั้งคุณสมบัติ CategoryId และหมวดหมู่

โดยทั่วไป คุณจะแมป Category เช่นกัน และการแมป Post ของคุณจะเชื่อมโยงทั้งสองอย่างโดยใช้คีย์ต่างประเทศ

คุณสามารถลองสิ่งนี้ได้แล้ว

session.Save(new Post(){ Category = new Category(){ Id = 3 } });

หวังว่านี่จะช่วยได้

person Mark Dickinson    schedule 21.05.2009
comment
คำแนะนำของคุณอยู่ในใจของฉัน แต่ฉันกำลังมองหาวิธีแก้ปัญหาที่แน่นอนสำหรับสิ่งนั้น โดยวิธีการที่ฉันใช้ fluent-nhibernate สำหรับการแมป ฉันเดาว่ามีวิธีการหรืออย่างอื่นที่ฉันพลาดซึ่งสามารถทำอะไรแบบนั้นได้ - person Ali Ersöz; 22.05.2009
comment
คุณต้องคิดถึงคำตอบของเลียม รหัสไม่มีทางรู้ได้ว่ารหัสหมวดหมู่นั้นถูกต้องหรือไม่ ดังนั้นรหัสจะละเมิดคีย์ต่างประเทศและทำให้เกิดข้อยกเว้น - person Mark Dickinson; 22.05.2009
comment
โดยปกติแล้วเมื่อคุณรู้สึกว่าคุณกำลังต่อสู้กับเทคโนโลยี นั่นเป็นเพราะว่าคุณเป็นอย่างนั้น หากคุณมีโอกาสออกแบบใหม่เพื่อให้คุณสามารถทำงานกับออบเจ็กต์ Category เป็นคุณสมบัติของ Post ได้ มันจะช่วยให้คุณไม่ต้องปวดหัวมากนัก :) - person Mark Dickinson; 22.05.2009
comment
ฉันมีเพื่อนร่วมงานคอยชักชวน และฉันก็ทำ :) การจัดการกับวัตถุเป็นวิธีที่ถูกต้องในการกำจัดสิ่งนั้น - person Ali Ersöz; 22.05.2009

ฉันไม่รู้ว่าสิ่งนี้เป็นไปได้สำหรับ NHibernate หรือไม่ จุดรวมของ ORM คือการจัดการกับอ็อบเจ็กต์ ไม่ใช่คีย์ต่างประเทศของ RDMS

person liammclennan    schedule 21.05.2009
comment
ฉันรู้ว่านี่ไม่ใช่แนวทางปฏิบัติที่ดีที่สุด และเป็นเรื่องพิเศษสำหรับ ORM แต่ฉันก็ต้องการสิ่งนั้นอยู่ดี - person Ali Ersöz; 22.05.2009