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で同等のものは何ですか?
ありがとうございました
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
として宣言する必要があります。
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());
}