Эквивалент для.HasOptional в Entity Framework Core 1 (EF7)


Рассмотрим два класса.

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

В EF6, для N: 1..0 отношение там был этот беглый API.

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

Что эквивалентно в ядре 1 структуры Entity?

Спасибо

2 29

2 ответа:

Вы не найдете эквивалентного метода в EF 7. По соглашению свойство, тип CLR которого может содержать null, будет сконфигурировано как необязательное. Итак, что решает, является ли отношение необязательным или нет, является ли свойство FKnullable или нет соответственно.

Таким образом, благодаря свойству Message_Id FK string, оно уже принимает значение null, поэтому если вы используете следующую конфигурацию Fluent Api:

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

EF настроит ваши отношения как необязательные (или N: 0..Один по просьбе).

В случае, если ваше свойство FK имеет тип значения int, Вы должны объявить его как nullable (int?).

Также я заметил, что теперь у вас есть свойство навигации с модификатором доступа internal. Вы всегда должны объявлять свойства вашей сущности как public.

В ядре EF вы можете использовать пути буксировки для связывания таблиц буксировки:

  • Внутри OnModelCreating:

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);            
    
        modelBuilder.Entity<File>()
                    .HasOne(c => c.Message)
                    .WithOne()
                    .HasForeignKey(c => c.MessageId)                           
    }
    
  • Создайте новый класс FileConfiguration и вызовите его внутри 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);
        }
    }
    

    А внутри OnModelCreating ставим ниже коды:

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