Подтвердить что ты не робот

Эквивалент для .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);

Что эквивалентно в Entity Framework Core 1?

Спасибо

4b9b3361

Ответ 1

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

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

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

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

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

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

Ответ 2

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

  • Внутри OnModelCreating:

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