web-dev-qa-db-ja.com

Entity Framework Core 1(EF7)の.HasOptionalに相当

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

modelBuilder.Entity<File>()
            .HasOptional(e => e.Message ).WithMany().HasForeignKey(e => e.Message_Id);

Entiity Framework Core 1で同等のものは何ですか?

ありがとうございました

37
Chatumbabub

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のような値型である場合、null可能(int?)。

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

62
octavioccl

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内で呼び出します:

    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());                                       
    }
    
5
Sina Lotfi