Khung thực thể mã-khoá ngoài null đầu tiên


107

Tôi có một User< Countrymô hình. Người dùng thuộc về một quốc gia, nhưng có thể không thuộc về bất kỳ quốc gia nào (khóa nước ngoài rỗng).

Làm cách nào để thiết lập điều này? Khi tôi cố gắng chèn một người dùng có quốc gia rỗng, nó cho tôi biết rằng quốc gia đó không thể là null.

Mô hình như sau:

 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;}
}

Lỗi: A foreign key value cannot be inserted because a corresponding primary key value does not exist. [ Foreign key constraint name = Country_Users ]"}


Bạn có thể vui lòng sửa cho tôi nếu tôi sai. Khóa ngoại là NULLABLE bởi DEFAULT trong khung thực thể asp.net mvc - 5 mã đầu tiên.
Unbreakable

1
Nếu chúng ta muốn làm cho nó không thể nullable. chúng ta cần sử dụng api thông thạo nếu không thì trang trí bằng thuộc tính "Bắt buộc". Tôi có đúng không?
Unbreakable

2
Nếu chúng ta không làm một trong hai thì chính nước ngoài sẽ được cài đặt sẵn để Nullable
Unbreakable

Câu trả lời:


165

Bạn phải đặt khóa ngoại của mình là vô hiệu:

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

7
ảo làm gì?
Shawn Mclean

32
Ảo là cần thiết cho tải chậm.
Ladislav Mrnka

2
Virtual cũng thêm theo dõi thay đổi, điều này không phải lúc nào cũng muốn. Khoảng thời gian duy nhất mà chúng tôi muốn ảo là trên các bộ sưu tập, nhưng YMMV.
Dan VanWinkle 24/10/12

1
@TravisJ user.Country trả về null sau đó ... bắt ngoại lệ (tối ưu) hoặc sử dụng if(eww)
SparK

7
Ngoài ra - điều này dường như không hoạt động đối với Guidcác phím dựa trên. (Nó làm cho chúng nullable, chắc chắn, nhưng tiết kiệm một kỷ lục cho cơ sở dữ liệu với các thiết lập chính nước ngoài để null thất bại do sự chủ chốt hạn chế nước ngoài tạo tự động.) :-(
BrainSlugs83

8

Tôi thích điều này hơn (bên dưới):

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

Bởi vì EF đang tạo 2 khóa ngoại trong bảng cơ sở dữ liệu: CountryId và CountryId1, nhưng đoạn mã trên đã sửa lỗi đó.


6

Tôi gặp vấn đề tương tự bây giờ, tôi có khóa ngoại và tôi cần đặt nó là nullable, để giải quyết vấn đề này, bạn nên đặt

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

trong lớp DBContext, tôi xin lỗi vì đã trả lời bạn rất muộn :)


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.