26

考慮兩個類。等效於.Has可選實體框架核心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); 

Equity Framework Framework 1中的等價物是什麼?

謝謝

回答

38

你不會找到在EF 7等效方法按照慣例,一個屬性,它的CLR類型可以包含null將被配置爲可選。那麼,如果FK的財產分別是nullable或者沒有,那麼決定這種關係是否可選。

綜上所述,由於您的Message_Id FK屬性爲string,它已經接受null值,因此,如果您使用以下流利的API配置:

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

EF將配置可選(或N的關係: 0..1根據要求)。

如果您的FK物業的價值類型爲int,則應聲明它爲可空(int?)。

另外我注意到現在你有一個導航屬性internal訪問修飾符。您應該始終聲明您的實體屬性爲public

+0

我想補充的觀察:EF也將根據需要配置賦予了'[必需]'對物業註釋,即使類型本身可爲空的關係。 – davidmdem

+0

不要以爲這是真的。 EF6和EF Core都能夠表示1:0..1的關係,因爲EntityA.PK是EntityB.PK的外鍵@PHP – shannon

+0

@shannon看一下這個[link](https://docs.microsoft.com/zh-cn/ -us/ef/core/modeling/relationships)並且以流利的api顯示我如何做一個'HasOptional'而不做我在我的答案 – octavioccl

0

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

    and inside OnModelCreating put下面的代碼:

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