等同于 Entity Framework Core 1 (EF7) 中的 .HasOptional

Equivalent for .HasOptional in 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 中的等效项是什么?

谢谢

您不会在 EF 7 中找到等效方法。按照惯例,CLR 类型可以包含 null 的 属性 将被配置为可选。因此,决定关系是否可选的是 FK 属性 是否分别为 nullable

综上所述,由于您的 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 这样的值类型,您应该将其声明为可为空的 (int?)。

我还注意到您现在有一个带有 internal 访问修饰符的导航 属性。您应该始终将您的实体属性声明为 public.

在 EF Core 中,您可以使用两种方式关联两个表:

  • 里面OnModelCreating:

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);            
    
        modelBuilder.Entity<File>()
                    .HasOne(c => c.Message)
                    .WithOne()
                    .HasForeignKey(c => c.MessageId)                           
    }
    
  • 创建新的 class 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());                                       
    }