เฮ้เพื่อนๆ ฉันมีปัญหาจริงๆ กับการทำแผนที่โดยใช้ไฮเบอร์เนตอย่างคล่องแคล่ว ฉันรู้ว่ามีโพสต์มากมายทั้งบนเว็บไซต์นี้และโพสต์อื่นๆ อีกมากมายที่เน้นไปที่การทำแผนที่ประเภทใดประเภทหนึ่งโดยเฉพาะ แต่ ณ ขณะนี้ ฉันยังไม่พบวิธีแก้ปัญหาที่สามารถแก้ไขปัญหาของฉันได้
นี่คือสิ่งที่ฉันมี:
namespace MyProject.Models.Entites
{
public class Project
{
public virtual Guid Id {get; set;}
// A load of other properties
public virtual ProjectCatagory Catagory{get;set;}
}
}
แล้วแผนที่:
namespace MyProject.DataAccess.ClassMappings
{
public class ProjectMap : ClassMap<Project>
{
public ProjectMap()
{
Id(x => x.Id);
Map(x => x.Title);
Map(x => x.Description);
Map(x => x.LastUpdated);
Map(x => x.ImageData).CustomSqlType("image");
HasOne(x => x.Catagory);
}
}
}
อย่างที่คุณเห็น ฉันมีโปรเจ็กต์ที่มีคุณสมบัติหมวดหมู่ ฉันไม่ได้สนใจฐานข้อมูลเชิงสัมพันธ์มากนัก แต่จากสิ่งที่ฉันคิดได้ นี่คือความสัมพันธ์แบบหลายกลุ่มที่หลายโครงการสามารถมีหมวดหมู่เดียวได้ ไม่ โครงการไม่สามารถจัดอยู่ในประเภทมากกว่าหนึ่งประเภทได้
ตอนนี้เรามี:
namespace MyProject.Models.Entities
{
public class ProjectCatagory
{
public virtual Guid Id { get; set; }
public virtual String Name { get; set; }
}
}
และแผนที่:
public ProjectCatagoryMap()
{
Id(x => x.Id);
Map(x => x.Name);
}
ปัญหาคือมันใช้งานไม่ได้ ! ฉันจะทำสิ่งที่คล้ายกับสิ่งต่อไปนี้ในการทดสอบหน่วย:
Project myproject = new Project("Project Description");
// set the other properties
myProject.Catagory = new ProjectCatagory(Guid.New(), "Test Catagory");
repository.Save(myProject);
ตอนนี้ฉันได้ลองใช้การกำหนดค่าการแมปและฐานข้อมูลหลายครั้งแล้วเมื่อพยายามทำให้สิ่งนี้ใช้งานได้ ขณะนี้ตารางฐานข้อมูลโครงการมีคอลัมน์ "Catagory_id" (ซึ่งฉันไม่ได้ใส่ไว้ที่นั่น ฉันคิดว่า NH เพิ่มมันเนื่องจากการแมป) และฉันจะชอบที่ตั้งค่าให้ไม่อนุญาตให้มีค่าว่าง อย่างไรก็ตาม เมื่อตั้งค่าเช่นนี้ ฉันได้รับข้อยกเว้นที่อธิบายว่าฉันไม่สามารถแทรกค่า Null ลงในตารางได้ (แม้ว่าในระหว่างการดีบัก ฉันได้ตรวจสอบคุณสมบัติทั้งหมดบนวัตถุ Project แล้วและค่าเหล่านั้นไม่ใช่ค่าว่าง)
อีกทางหนึ่ง ฉันสามารถอนุญาตให้ตารางยอมรับค่าว่างลงในคอลัมน์นั้นได้ และตารางจะบันทึกวัตถุ Project และไม่สนใจคุณสมบัติ Category โดยสิ้นเชิงเมื่อทำการบันทึก ดังนั้น เมื่อถูกดึงข้อมูล ให้ทดสอบเพื่อตรวจสอบว่าหมวดหมู่ที่ถูกต้องเชื่อมโยงกับโครงการล้มเหลวหรือไม่ .
ถ้าฉันจำไม่ผิด มีอยู่ช่วงหนึ่งที่ฉันมีการใช้ ProjectMap:
References(x => x.Catagory).Column("Catagory_id").Cascade.All().Not.Nullable();
สิ่งนี้เปลี่ยนข้อยกเว้นจาก "ไม่สามารถแทรกค่า Null" เป็นการละเมิดคีย์ต่างประเทศ
ฉันสงสัยว่าต้นตอของความยุ่งยากทั้งหมดนี้มาจากการขาดความเข้าใจในการตั้งค่าฐานข้อมูลเชิงสัมพันธ์เนื่องจากฉันมีเอนทิตีอื่น ๆ ในโครงการนี้ที่ไม่มีการพึ่งพาภายนอกซึ่งทำงานได้ดีกับ NHibernate โดยตัดปัญหาการเข้ารหัสใด ๆ ที่ฉันอาจเกิดขึ้นเมื่อ การสร้างพื้นที่เก็บข้อมูล
ความช่วยเหลือใด ๆ ที่ชื่นชมอย่างมาก ขอบคุณ