Varlık çerçeve kodu-ilk boş yabancı anahtar


107

Bir var User< Countrymodeli. Bir kullanıcı bir ülkeye aittir, ancak herhangi bir (boş yabancı anahtara) ait olamaz.

Bunu nasıl kurarım? Null ülkesi olan bir kullanıcı eklemeye çalıştığımda, bana bunun boş olamayacağını söylüyor.

Model aşağıdaki gibidir:

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

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


Hatalıysam lütfen beni düzeltebilir misin? Bir yabancı anahtar, ilk olarak asp.net mvc - 5 varlık çerçevesi kodunda VARSAYILAN tarafından NULLABLE olur.
Unbreakable

1
Eğer null yapılamaz hale getirmek istiyorsak. Ya akıcı api kullanmalıyız, yoksa "Gerekli" özniteliğiyle dekore etmemiz gerekir. Doğrumuyum?
Unbreakable

2
İkisini de yapmazsak, Yabancı anahtar varsayılan olarak Nullable
Unbreakable

Yanıtlar:


166

Yabancı anahtarınızı nullable yapmalısınız:

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

7
sanal ne yapar?
Shawn Mclean

32
Geç yükleme için sanal gereklidir.
Ladislav Mrnka

2
Sanal ayrıca, her zaman istenmeyen değişiklik izleme özelliğini de ekler. Sanal olmasını istediğimiz tek zaman koleksiyonlarda, ancak YMMV'de.
Dan VanWinkle

1
@TravisJ user.Country null döndürür sonra ... ya istisnayı yakala (optimal) ya da kullan if(eww)
SparK

7
Ayrıca - bu Guidtemel anahtarlar için işe yaramıyor gibi görünüyor . (Elbette onları null yapılabilir yapar, ancak yabancı anahtar null olarak ayarlanmış bir kaydı veritabanına kaydetmek, otomatik olarak oluşturulan bir yabancı anahtar kısıtlaması nedeniyle başarısız olur.) :-(
BrainSlugs83

8

Bunu tercih ederim (aşağıda):

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

EF veritabanı tablosunda 2 yabancı anahtar oluşturduğundan: CountryId ve CountryId1, ancak yukarıdaki kod bunu düzeltti.


6

Şimdi aynı problemim var, yabancı anahtarım var ve onu nullable olarak koymam gerekiyor, bu sorunu çözmek için koymanız gereken

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

DBContext sınıfında size çok geç cevap verdiğim için özür dilerim :)


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.