26

Rozważ dwie klasy.Równoważna dla .HasOptional w Entity Framework Core 1 (EF7)

public class File 
{ 
    [Key] 
    public string Id { get; set; } 

    public string Message_Id { get; set; } 

    internal Message Message { get; set; } 
} 

public class Message 
{ 
    [Key] 
    public string Id { get; set; }  
} 

W EF6, dla relacji N: 1..0 istniał ten płynny interfejs API.

modelBuilder.Entity<File>() 
      .HasOptional(e => e.Message).WithMany().HasForeignKey(e => e.Message_Id); 

Co jest równoważne w Podstawowym module 1 programu Entiity?

Dziękuję

Odpowiedz

38

Nie znajdziesz równoważną metodę w EF 7. umownie właściwości którego CLR typ może zawierać null zostanie skonfigurowany jako opcjonalne. Więc to, co decyduje, czy związek jest opcjonalny, czy nie jest, jeśli właściwość FK jest nullable lub nie.

Podsumowując, z powodu swojej Message_Id własności FK jest string, to już akceptuje null wartość, więc jeśli można użyć następującego Fluent konfiguracji API:

modelBuilder.Entity<File>() 
      .HasOne(s => s.Message) 
      .WithMany() 
      .HasForeignKey(e => e.Message_Id) 

EF skonfiguruje swój związek jako opcjonalne (lub N: 0..1 zgodnie z życzeniem).

Jeśli twoja własność FK ma typ wartości, taki jak int, powinieneś zadeklarować ją jako zerową (int?).

Zauważyłem również, że masz teraz właściwość nawigacji z modyfikatorem dostępu internal. Powinieneś zawsze zadeklarować właściwości swojej jednostki jako public.

+0

Wystarczy dodać spostrzeżenie: EF będzie również skonfigurować jako zależność wymagane otrzymał '[Wymagane]' adnotacji na nieruchomości, nawet jeśli sam typ jest pustych. – davidmdem

+0

Nie myśl, że to prawda. Rdzeń EF6 i EF są w stanie reprezentować relacje 1: 0..1, ponieważ EntityA.PK jest kluczem obcym EntityB.PK – shannon

+0

@shannon Zajrzyj do tego [link] (https://docs.microsoft.com/pl -us/ef/core/modeling/relationship) i pokaż mi w płynnym api jak zrobić 'HasOptional' bez robienia tego co wyjaśniam w mojej odpowiedzi – octavioccl

0

W EF Rdzenia można stosując sposoby holowania za odnoszące tabele holowniczych:

  • Wewnątrz OnModelCreating:

    protected override void OnModelCreating(ModelBuilder modelBuilder) 
    { 
        base.OnModelCreating(modelBuilder);    
    
        modelBuilder.Entity<File>() 
           .HasOne(c => c.Message) 
           .WithOne() 
           .HasForeignKey(c => c.MessageId)       
    } 
    
  • Utwórz nową klasę FileConfiguration i nazywając go wewnątrz OnModelCreating:

    public class FileConfiguration : IEntityTypeConfiguration<File> 
    { 
        public void Configure(EntityTypeBuilder<File> builder) 
        {   
         builder.ToTable("File");    
    
         // Id 
         builder.HasKey(c => c.Id); 
         builder.Property(c => c.Id) 
           .ValueGeneratedOnAdd(); 
    
         // Message 
         builder.HasOne(c => c.Message) 
           .WithOne(c => c.File) 
           .HasForeignKey<Message>(c => c.MessageId) 
           .OnDelete(DeleteBehavior.Restrict); 
        } 
    } 
    

    i wewnątrz OnModelCreating put poniżej kody:

    protected override void OnModelCreating(ModelBuilder modelBuilder) 
    { 
        base.OnModelCreating(modelBuilder); 
    
        modelBuilder.ApplyConfiguration(new FileConfiguration());          
    }