นี่คือการอ้างอิงถึงคำตอบของ @Ladislav Mrnka เกี่ยวกับการใช้ API ได้อย่างคล่องแคล่วสำหรับการกำหนดค่าความสัมพันธ์แบบหนึ่งต่อหนึ่ง
มีสถานการณ์ที่FK of dependent must be it's PK
ไม่สามารถทำได้
เช่นFoo
มีความสัมพันธ์แบบหนึ่งต่อหลายคนBar
อยู่แล้ว
public class Foo {
public Guid FooId;
public virtual ICollection<> Bars;
}
public class Bar {
//PK
public Guid BarId;
//FK to Foo
public Guid FooId;
public virtual Foo Foo;
}
ตอนนี้เราต้องเพิ่มความสัมพันธ์แบบหนึ่งต่อหนึ่งระหว่างฟูกับบาร์
public class Foo {
public Guid FooId;
public Guid PrimaryBarId;// needs to be removed(from entity),as we specify it in fluent api
public virtual Bar PrimaryBar;
public virtual ICollection<> Bars;
}
public class Bar {
public Guid BarId;
public Guid FooId;
public virtual Foo PrimaryBarOfFoo;
public virtual Foo Foo;
}
นี่คือวิธีระบุความสัมพันธ์แบบหนึ่งต่อหนึ่งโดยใช้ API ได้อย่างคล่องแคล่ว:
modelBuilder.Entity<Bar>()
.HasOptional(p => p.PrimaryBarOfFoo)
.WithOptionalPrincipal(o => o.PrimaryBar)
.Map(x => x.MapKey("PrimaryBarId"));
โปรดทราบว่าในขณะที่การเพิ่มPrimaryBarId
จะต้องลบออกตามที่เราระบุผ่าน API ได้อย่างคล่องแคล่ว
โปรดทราบด้วยว่าชื่อวิธีการ[WithOptionalPrincipal()][1]
นั้นเป็นเรื่องที่น่าขัน ในกรณีนี้อาจารย์ใหญ่คือบาร์ WithOptionalD พึ่งพาคำอธิบาย()บนmsdnทำให้ชัดเจนยิ่งขึ้น