26

Betrachten Sie zwei Klassen.Äquivalent für .HasOptional in 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; }  
} 

In EF6, für N: 1..0 Beziehung gab es diese fließende API.

Was ist in Entity Framework Core 1 gleichwertig?

Danke

Antwort

38

Sie werden nicht eine entsprechende Methode in EF 7. Vereinbarungs eine Eigenschaft, deren CLR-Typ enthalten null als optional konfiguriert werden finden. Was also entscheidet, ob die Beziehung optional ist oder nicht, ist, ob die FK-Eigenschaft nullable ist oder nicht.

Zusammengefasst aufgrund Ihrer Message_Id FK Eigenschaft ist string, es nimmt bereits null Wert, also wenn Sie verwenden Sie die folgende Fluent Api-Konfiguration:

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

EF Ihre Beziehung als optional konfigurieren (oder N: 0..1 wie angefordert).

Wenn Ihre FK-Eigenschaft einen Wertstyp wie int hat, sollten Sie sie als nullwert deklarieren (int?).

Auch ich habe jetzt festgestellt, dass Sie eine Navigationseigenschaft mit internal Zugriffsmodifikator haben. Sie sollten Ihre Entitätseigenschaften immer als public deklarieren.

+0

nur eine Beobachtung hinzufügen: EF wird auch die Beziehung konfigurieren, wie eine '[Erforderlich]' Anmerkung auf dem Grundstück gegeben erforderlich, auch wenn die Art selbst NULL-Werte zulässt. – davidmdem

+0

Denke nicht, dass das wahr ist. EF6 und EF Core sind beide in der Lage, 1: 0..1 Beziehungen darzustellen, da EntityA.PK ein Fremdschlüssel für EntityB.PK – shannon

+0

@shannon ist. Schauen Sie in diesem [link] (https://docs.microsoft.com/en -us/ef/core/modelling/relationships) und zeige mir in fließendem api, wie man ein 'HasOptional' macht, ohne das zu tun, was ich in meiner Antwort erkläre – octavioccl

0

In EF-Core Sie können in Bezug Schlepptau Tabellen Schlepptau Arten mit:

  • Innen OnModelCreating:

    protected override void OnModelCreating(ModelBuilder modelBuilder) 
    { 
        base.OnModelCreating(modelBuilder);    
    
        modelBuilder.Entity<File>() 
           .HasOne(c => c.Message) 
           .WithOne() 
           .HasForeignKey(c => c.MessageId)       
    } 
    
  • neue Klasse erstellen FileConfiguration und es innerhalb OnModelCreating Aufruf:

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

    und in OnModelCreating setzen unter Codes:

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