두 가지 클래스를 고려하십시오.
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);
Entity 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에서는 두 가지 테이블을 연결하는 두 가지 방법을 사용할 수 있습니다.
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());
}