L'équivalent pour.Aoptional in Entity Framework Core 1 (EF7)

envisagez 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 N: 1..0 relation il y avait cette API fluente.

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

Qu'est-ce que l'équivalent en Entiity Core 1?

Merci

29
demandé sur Chatumbabub 2016-02-22 22:46:37

2 réponses

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é comme facultatif. Alors ce qui décide si la relation est optionnelle ou pas, c'est si la propriété FK est nullable ou pas, respectivement.

En résumé, en raison de votre string, il accepte déjà null valeur, donc si vous utilisez la configuration courante suivante de L'Api:

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

le FE va configurer votre relation en option (ou N : 0..1 tel que demandé).

dans le cas de votre propriété FK, le type de valeur est int, vous devriez le déclarer nul (int?).

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

46
répondu octavioccl 2017-09-06 18:27:54

En EF Core, vous pouvez à l'aide de deux façons à l'égard de remorquage 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éer une nouvelle classe FileConfiguration et l'appel à l'intérieur de 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 à l'intérieur de OnModelCreating mettre ci-dessous les codes:

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
    
        modelBuilder.ApplyConfiguration(new FileConfiguration());                                       
    }
    
0
répondu Sina Lotfi 2018-01-24 04:13:28