web-dev-qa-db-fra.com

Equivalent pour .HasOptional dans Entity Framework Core 1 (EF7)

Considérez deux classes.

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

Dans EF6, pour la relation N: 1..0, il y avait cette API courante.

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

Qu'est-ce qui est équivalent dans Entiity Framework Core 1?

Merci

37
Chatumbabub

Vous ne trouverez pas de méthode équivalente dans EF 7. Par convention, une propriété dont le type CLR peut contenir null sera configurée comme facultative. Donc, ce qui décide si la relation est facultative ou non, c'est si la propriété FK est nullable ou non respectivement.

En résumé, grâce à votre Message_Id La propriété FK est string, elle accepte déjà la valeur null, donc si vous utilisez la configuration Fluent Api suivante:

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

EF configurera votre relation comme facultative (ou N: 0..1 comme demandé).

Si votre propriété FK est de type valeur comme int, vous devez la déclarer nullable (int?).

J'ai également remarqué que vous avez maintenant une propriété de navigation avec le modificateur d'accès internal. Vous devez toujours déclarer vos propriétés d'entité comme public.

62
octavioccl

Dans EF Core, vous pouvez utiliser deux méthodes pour associer deux tables:

  • À l'intérieur OnModelCreating:

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);            
    
        modelBuilder.Entity<File>()
                    .HasOne(c => c.Message)
                    .WithOne()
                    .HasForeignKey(c => c.MessageId)                           
    }
    
  • Créez une nouvelle classe FileConfiguration et appelez-la dans 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);
        }
    }
    

    et dans OnModelCreating, mettez les codes ci-dessous:

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