26

2つのクラスを考慮してください。エンティティフレームワークコア1(EF7)の.HasOptionalに相当。

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がありました。

Entiity Framework Core 1に相当するものは何ですか?

あなたは

答えて

38

あなたが慣例、そのCLRタイプnullを含むことができ、オプションとして設定されますプロパティにより、EF 7で同等の方法を見つけることができませんありがとうございました。したがって、関係がオプションかどうかは、FKプロパティがそれぞれnullableかどうかで決まります。原因あなたMessage_Id FKプロパティに要約する

は、それがすでにnull値を受け取り、stringですので、あなたは、次の流暢API設定を使用する場合:

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

EFがオプション(またはNなどのあなたの関係を設定します:要求に応じて0..1)。

FKプロパティの値がintのような値の場合は、nullable(int?)と宣言する必要があります。

また、internalアクセス修飾子を持つナビゲーションプロパティがあります。エンティティプロパティは常にpublicと宣言する必要があります。あなたが牽引テーブルを関連付けるためのトウの方法を使用してできEFコアで

+0

だけで観測を追加するには:必要に応じて、EFも型自体がNULL可能である場合でも、財産上の '[必須]'注釈一定の関係を設定しますコード以下。 – davidmdem

+0

これは本当だとは思わないでください。 EF6とEFコアはEntityB.PKの外部キーであるため、1:0..1の関係を表すことができます。 – shannon

+0

@shannonこの[link](https://docs.microsoft.com/ja)をご覧ください-us/ef/core/modeling/relationships)と流暢なAPIを使って、私が私の答えで説明したことをせずに 'HasOptional'を行う方法を教えてください。 – octavioccl

0

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 put

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