Vraag Equivalent voor .HasOptional in Entity Framework Core 1 (EF7)


Overweeg twee 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 was er voor N: 1..0 een vloeiende API.

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

Wat is equivalent in Entiity Framework Core 1?

Dank je


27
2018-02-22 19:46


oorsprong


antwoorden:


U vindt geen equivalente methode in EF 7. Per conventie is een eigenschap waarvan het CLR-type kan bestaan null wordt als optioneel geconfigureerd. Dus wat beslissen of de relatie optioneel is of niet, is als de FK-eigenschap is nullable of niet respectievelijk.

Samenvattend, vanwege uw Message_Id  FK-eigendom is string, het accepteert al null waarde, dus als u de volgende Fluent Api-configuratie gebruikt:

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

EF zal uw relatie configureren als optioneel (of N: 0..1 zoals gevraagd).

In het geval dat uw FK-eigenschap het waardetype is int, moet u het als nullable aangeven (int?).

Ook merkte ik nu dat je een navigatie-eigenschap hebt met internal toegang modifier. U moet altijd uw entiteitseigenschappen als aangeven public.


42
2018-02-22 20:01



In EF Core kunt u sleepmanieren gebruiken voor het relateren van sleeptabellen:

  • Binnen OnModelCreating:

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);            
    
        modelBuilder.Entity<File>()
                    .HasOne(c => c.Message)
                    .WithOne()
                    .HasForeignKey(c => c.MessageId)                           
    }
    
  • Maak een nieuwe klas FileConfiguration en het naar binnen te roepen 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);
        }
    }
    

    en in OnModelCreatie van onderstaande codes:

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

0
2018-01-23 14:37