wake-up-neo.com

Entspricht .HasOptional in Entity Framework Core 1 (EF7)

Betrachten Sie zwei Klassen.

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 gab es für die Beziehung N: 1..0 diese fließende API.

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

Was ist in Entiity Framework Core 1 gleichwertig?

Vielen Dank

37
Chatumbabub

In EF 7 finden Sie keine äquivalente Methode. Gemäß der Konvention wird eine Eigenschaft, deren CLR-Typ null enthalten kann, als optional konfiguriert. Also, was entscheiden, ob die Beziehung optional ist oder nicht, ist, ob die FK-Eigenschaft nullbar ist oder nicht.

Zusammenfassend lässt sich sagen, dass aufgrund Ihres Message_Id FK-Eigenschaft ist string, akzeptiert bereits null -Wert, wenn Sie also die folgende Fluent-API-Konfiguration verwenden:

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

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

Wenn Ihre FK-Eigenschaft vom Werttyp int ist, sollten Sie sie als nullable deklarieren (int?).

Außerdem ist mir aufgefallen, dass Sie jetzt eine Navigationseigenschaft mit dem Zugriffsmodifikator internal haben. Sie sollten Ihre Entitätseigenschaften immer als public deklarieren.

62
octavioccl

In EF Core haben Sie zwei Möglichkeiten, um zwei Tabellen zu verknüpfen:

  • Innerhalb von OnModelCreating:

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);            
    
        modelBuilder.Entity<File>()
                    .HasOne(c => c.Message)
                    .WithOne()
                    .HasForeignKey(c => c.MessageId)                           
    }
    
  • Erstelle eine neue Klasse FileConfiguration und rufe sie in OnModelCreating auf:

    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 die folgenden Codes eingeben:

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