Entity Framework(EF)Code First是一种用于.NET平台的对象关系映射(ORM)技术,它允许开发者通过C#类定义来创建数据库模式。本文将介绍如何使用Data Annotations和Fluent API两种方式来配置数据库。
在Code First开发模式中,Data Annotations是一种通过在类属性上添加属性来定义数据库结构的简单方式。例如,可以为字符串类型的属性指定最大长度,或者标记某个属性为必填项。
public class Project
{
public int ProjectId { get; set; }
[MaxLength(255)]
[Required]
public string Name { get; set; }
public int ManagerId { get; set; }
[ForeignKey("ManagerId")]
public Person Manager { get; set; }
}
在上面的代码中,定义了Project类,其中Name属性被标记为必填项,并且最大长度被限制为255字符。
public class Person
{
public int PersonId { get; set; }
public string LastName { get; set; }
public string FirstName { get; set; }
[Column("Birth")]
public DateTime BirthDate { get; set; }
}
在这个Person类中,通过Column属性改变了BirthDate属性对应的数据库列名,将其从默认的BirthDate改为了Birth。
public class Task
{
public int TaskId { get; set; }
public string Title { get; set; }
public string Description { get; set; }
public int PersonId { get; set; }
[ForeignKey("PersonId")]
public Person AssignedTo { get; set; }
public int ProjectId { get; set; }
[ForeignKey("ProjectId")]
public Project Project { get; set; }
}
public class Project
{
public int ProjectId { get; set; }
[MaxLength(255)]
[Required]
public string Name { get; set; }
public List Tasks { get; set; }
}
Task类中定义了两个外键属性,分别指向Person和Project类。通过Data Annotations,能够直接在类定义中声明外键关系。
Fluent API是Entity Framework提供的一种更为灵活和强大的数据库配置方式。它允许在DbContext派生类的OnModelCreating方法中定义复杂的数据库结构。
public class MyContext : DbContext
{
public DbSet Persons { get; set; }
public DbSet Projects { get; set; }
public DbSet Tasks { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity().HasRequired(t => t.Project).WithMany(p => p.Tasks).HasForeignKey(t => t.ProjectId).WillCascadeOnDelete(false);
modelBuilder.Entity().HasRequired(t => t.AssignedTo);
}
}
在MyContext类中,使用Fluent API定义了Task和Project之间的一对多关系,并且指定了在删除Project时不会级联删除Task。
modelBuilder.Entity().Property(d => d.BirthDate).HasColumnName("Birth");
通过Fluent API,可以在不使用Data Annotations的情况下定义列名。
modelBuilder.Entity().HasRequired(p => p.Manager);
在这个例子中,使用Fluent API指定了Project类必须有一个Manager属性。
modelBuilder.Entity().Property(p => p.Name).HasMaxLength(255).IsRequired();