Câu hỏi Khóa ngoại lệ rỗng đầu tiên của khung thực thể


tôi có một User < Country mô hình. Một người dùng thuộc về một quốc gia, nhưng có thể không thuộc về bất kỳ (null khóa ngoại).

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 với một quốc gia rỗng, nó nói với tôi rằng nó 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 ]"}


76
2018-04-14 19:46


gốc


Bạn có thể vui lòng sửa tôi nếu tôi sai. Khóa ngoài là NULLABLE bởi DEFAULT trong mã lệnh asp.net mvc - 5 thực thể đầu tiên. - Unbreakable
Nếu chúng ta muốn làm cho nó không 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
Nếu chúng ta không làm được thì khóa ngoại sẽ được mặc định thành Nullable - Unbreakable


Các câu trả lời:


Bạn phải làm cho khóa ngoại của bạn có thể vô hiệu hóa:

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

124
2018-04-14 19:49



những gì hiện ảo làm gì? - Shawn Mclean
Virtual là cần thiết cho tải chậm. - Ladislav Mrnka
Ảo cũng thêm vào theo dõi thay đổi, 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
@TravisJ user.Country trả về null sau đó ... hoặc bắt được ngoại lệ (tối ưu) hoặc sử dụng if (eww) - SparK
Ngoài ra - điều này dường như không hoạt động Guid các khóa dựa trên. (Nó làm cho chúng vô hiệu, chắc chắn, nhưng lưu một bản ghi vào cơ sở dữ liệu với khóa ngoại được đặt thành không thành công do ràng buộc khóa ngoài được tạo tự động.) :-( - BrainSlugs83


Tôi có cùng một vấn đề, Tôi có chìa khóa nước ngoài và tôi cần đặt nó là vô giá trị, để 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 :)


0
2017-07-17 17:22