Entity Framework Core 1(EF7)の.HasOptionalに相当します。

.net-core asp.net-core asp.net-core-1.0 entity-framework entity-framework-core

質問

2つのクラスを考えます。

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に相当するものは何ですか?

ありがとうございました

受け入れられた回答

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ような値型である場合は、それをnullable( int? )として宣言する必要があります。

また、 internalアクセス修飾子を持つナビゲーションプロパティがあることに気付きました。エンティティプロパティは常にpublicとして宣言する必要があります。


人気のある回答

EF Coreでは、2つのテーブルを関連付けるために2つの方法を使用できます。

  • OnModelCreating内側:

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);            
    
        modelBuilder.Entity<File>()
                    .HasOne(c => c.Message)
                    .WithOne()
                    .HasForeignKey(c => c.MessageId)                           
    }
    
  • 新しいクラスFileConfigurationを作成し、それをOnModelCreating内で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());                                       
    }
    


Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ