В контексте EF пометка свойства как виртуального позволяет EF использовать отложенную загрузку для его загрузки. Чтобы ленивая загрузка работала, EF должен создать прокси-объект, который переопределяет ваши виртуальные свойства с помощью реализации, которая загружает указанную сущность при первом обращении к ней. Если вы не пометите свойство как виртуальное, то отложенная загрузка не будет работать с ним.
Для веб-приложений, возможно, лучше не использовать отложенную загрузку, потому что отложенная загрузка может тянуть огромное количество данных.
Предполагая, что вы хотите сгенерировать модель / отношения вашей базы данных из ваших объектов / классов (миграция кода вначале с ядром EF), наиболее важной частью являются конфигурации отображения ваших сущностей (либо с аннотациями). в свойствах вашей модели или с помощью Fluent API).
Если у вас нет особых требований c относительно формата свойства "Id", просто установите его для создания базой данных.
В вашем случае я бы настроил его следующим образом:
class Class
{
public int ClassId { get; set; }
public string ClassName { get; set; }
public ICollection<Student> Students { get; set; }
}
class Student
{
public int StudentId { get; set; }
public string StudentName { get; set; }
public int ClassId { get; set; }
public Class class { get; set; }
}
И один из способов настройки сопоставлений с помощью Fluent API может выглядеть примерно так:
public class StudentConfiguration : IEntityTypeConfiguration<Student>
{
public void Configure(EntityTypeBuilder<Student> builder)
{
builder
.HasKey(s => s.StudentId);
builder
.Property(s => s.StudentId)
.UseIdentityColumn();
builder
.Property(c => c.StudentName)
.HasMaxLength(<studentName_maxLength>);
builder
.HasOne(s => s.Class)
.WithMany(c => c.Students)
.HasForeignKey(s => s.ClassId);
builder
.ToTable("Student");
}
}
public class ClassConfiguration : IEntityTypeConfiguration<Class>
{
public void Configure(EntityTypeBuilder<Class> builder)
{
builder
.HasKey(c => c.ClassId);
builder
.Property(c => c.ClassId)
.UseIdentityColumn();
builder
.Property(c => c.ClassName)
.HasMaxLength(<className_maxLength>);
builder
.HasMany(c => c.Students)
.WithOne(s => s.Class);
builder
.ToTable("Class");
}
}
Подробнее подробную информацию о настройке сопоставлений «один-ко-многим» в Fluent API можно найти здесь