รหัสเฟรมเวิร์กของเอนทิตี - คีย์นอกที่เป็นโมฆะแรก


107

ฉันมีUser< Countrymodel. ผู้ใช้เป็นของประเทศ แต่ไม่สามารถอยู่ใน (คีย์นอกที่เป็นค่าว่าง)

ฉันจะตั้งค่านี้ได้อย่างไร? เมื่อฉันพยายามแทรกผู้ใช้ด้วยประเทศว่างมันบอกฉันว่ามันไม่สามารถเป็นโมฆะได้

โมเดลมีดังนี้:

 public class User{
    public int CountryId { get; set; }
    public Country Country { get; set; }
}

public class Country{
    public List<User> Users {get; set;}
    public int CountryId {get; set;}
}

ข้อผิดพลาด: A foreign key value cannot be inserted because a corresponding primary key value does not exist. [ Foreign key constraint name = Country_Users ]"}


คุณช่วยแก้ไขฉันได้ไหมถ้าฉันผิด คีย์ต่างประเทศเป็นโมฆะโดยค่าเริ่มต้นในโค้ดแรกกรอบเอนทิตี asp.net mvc - 5
Unbreakable

1
หากเราต้องการทำให้ไม่เป็นโมฆะ เราจำเป็นต้องใช้ api ที่คล่องแคล่วหากไม่ได้ตกแต่งด้วยแอตทริบิวต์ "จำเป็น" ฉันถูกไหม?
Unbreakable

2
หากเราไม่ทำอย่างใดอย่างหนึ่ง Foreign key จะผิดนัดเป็น Nullable
Unbreakable

คำตอบ:


166

คุณต้องทำให้คีย์ต่างประเทศของคุณว่างเปล่า:

public class User
{
    public int Id { get; set; }
    public int? CountryId { get; set; }
    public virtual Country Country { get; set; }
}

7
Virtual ทำอะไร?
Shawn Mclean

32
Virtual เป็นสิ่งจำเป็นสำหรับการโหลดที่ขี้เกียจ
Ladislav Mrnka

2
Virtual ยังเพิ่มการติดตามการเปลี่ยนแปลงซึ่งไม่ต้องการเสมอไป ในช่วงเวลาเดียวที่เราต้องการเสมือนคือในคอลเล็กชัน แต่ YMMV
Dan VanWinkle

1
ผู้ใช้ @TravisJ ประเทศคืนค่า null จากนั้น ... จับข้อยกเว้น (เหมาะสมที่สุด) หรือใช้if(eww)
SparK

7
นอกจากนี้ - ดูเหมือนจะใช้ไม่ได้กับGuidคีย์ที่ใช้ (ทำให้เป็นโมฆะได้แน่นอน แต่การบันทึกบันทึกลงในฐานข้อมูลโดยตั้งค่าคีย์ต่างประเทศเป็น null ล้มเหลวเนื่องจากข้อ จำกัด ของคีย์ต่างประเทศที่สร้างขึ้นโดยอัตโนมัติ) :-(
BrainSlugs83

8

ฉันชอบสิ่งนี้ (ด้านล่าง):

public class User
{
    public int Id { get; set; }
    public int? CountryId { get; set; }
    [ForeignKey("CountryId")]
    public virtual Country Country { get; set; }
}

เนื่องจาก EF กำลังสร้างคีย์ต่างประเทศ 2 คีย์ในตารางฐานข้อมูล: CountryId และ CountryId1 แต่โค้ดด้านบนได้รับการแก้ไขแล้ว


6

ฉันมีปัญหาเดียวกันตอนนี้ฉันมีคีย์ต่างประเทศและฉันต้องใส่เป็นโมฆะเพื่อแก้ปัญหานี้คุณควรใส่

    modelBuilder.Entity<Country>()
        .HasMany(c => c.Users)
        .WithOptional(c => c.Country)
        .HasForeignKey(c => c.CountryId)
        .WillCascadeOnDelete(false);

ในคลาส DBContext ขอโทษที่ตอบช้ามาก :)


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