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
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
.
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 deOnModelCreating
: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()); }