相当于。实体框架核心1中的.HasOptional(EF7)

时间:2016-02-22 19:46:38

标签: entity-framework asp.net-core entity-framework-core .net-core asp.net-core-1.0

考虑两个班级。

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

在Entiity Framework Core 1中有什么相同的东西?

谢谢

2 个答案:

答案 0 :(得分:59)

您不会在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

答案 1 :(得分:3)

在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并在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());                                       
    }