在Entity Framework中,Fluent API提供了一种强大而灵活的方式来配置数据模型。本文将通过一个简单的例子,展示如何使用Fluent API来定义模型的属性和关系。请注意,由于Fluent API可能会随着Entity Framework版本的更新而发生变化,因此本文所介绍的内容可能在未来的版本中有所不同。
在本例中,将使用以下模型:
public class SchoolEntities : DbContext
{
#region Properties
public DbSet Courses { get; set; }
public DbSet Departments { get; set; }
#endregion
#region Methods
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
// 在这里编写Fluent API代码
}
#endregion
}
public partial class Course
{
#region Properties
public int CourseID { get; set; }
public string Title { get; set; }
public string Days { get; set; }
public DateTime Time { get; set; }
public string Location { get; set; }
public int Credits { get; set; }
public int DepartmentID { get; set; }
public virtual Department Department { get; set; }
#endregion
}
public class Department
{
#region Properties
public int DepartmentID { get; set; }
public string Name { get; set; }
public decimal Budget { get; set; }
public DateTime StartDate { get; set; }
public int Administrator { get; set; }
public virtual ICollection Courses { get; set; }
#endregion
}
创建模型后,可以使用Fluent API来配置模型。主要的配置工作是在DbContext类中重写的OnModelCreating方法中完成的。该方法接收一个ModelBuilder实例,可以使用它来配置模型。以下示例展示了如何使用API进行一些配置:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity()
.Property(d => d.Name)
.IsRequired()
.HasMaxLength(50);
modelBuilder.Entity()
.Property(d => d.DepartmentID)
.HasDatabaseGenerationOption(DatabaseGenerationOption.None);
modelBuilder.Entity()
.HasMany(d => d.Courses)
.WithRequired(c => c.Department)
.HasForeignKey(c => c.DepartmentID)
.WillCascadeOnDelete();
modelBuilder.Entity()
.Ignore(d => d.Administrator);
modelBuilder.Entity()
.Property(c => c.Title)
.IsRequired()
.HasColumnName("Name");
}
以上代码展示了如何配置实体。首先,使用Entity方法并传入实体作为泛型参数。然后,可以开始使用Fluent API来配置模型。第一行代码配置了Department实体的Name属性为必填项,并且长度不超过50个字符。第二行代码配置了DepartmentID属性为非数据库生成(默认情况下,所有ID都是数据库生成的)。第三行代码创建了部门与其课程集合之间的一对多关系。首先使用HasMany表示多的一方,然后使用WithRequired表示一的一方。HasForeignKey表示多的一方的外键。最后的方法WillCascadeOnDelete将添加级联删除到实体图。第四行代码将强制模型忽略部门的Administrator属性,因此它不会被生成到数据库中。第五行代码表示Title属性是必填的,并且在数据库中列的名称将是Name而不是Title。
以下是一个简单的示例,展示了如何创建数据并将其插入数据库:
class Program
{
static void Main(string[] args)
{
using (SchoolEntities context = new SchoolEntities())
{
var department = new Department
{
DepartmentID = 1,
Administrator = 2,
Budget = 100000,
Name = "Data Access",
StartDate = DateTime.Now
};
var course = new Course
{
Credits = 2,
Days = "MF",
Location = "Class 1",
Time = DateTime.Now,
Title = "Entity Framework",
Department = department,
};
context.Departments.Add(department);
context.SaveChanges();
}
}
}
public SchoolEntities() : base("MySchool")
{
}