在前面的章节中中了解了 EF Core 中的默认约定。 有些时候我们想自定义实体到表的映射,不想遵循默认约定。 EF Core 允许我们自定义这类的操作。(通常来说我们应该使用默认的约定,这叫约定大于配置 同样的使用 annotation attribute也会比fluent api好一点,更直观了)
有两种方法可以在 EF Core 中配置域类(与 EF 6 中相同)。
数据注释是一种简单的基于特性的配置方法,可以将不同的 .NET 属性应用于class和属性以配置模型。
数据注释属性并非专用于EF Core,因为它们也可以被用在 ASP.NET MVC 中。 这就是这些特性包含在单独的命名空间 System.ComponentModel.DataAnnotations 中的原因。
还有一些跟数据库相关的是放在 System.ComponentModel.DataAnnotations.Schema Attributes 命名空间下。 以下示例演示了如何将数据批注特性应用于实体类及它的属性上面。
[Index(nameof(Name))] //给Name创建一个索引
[Index(nameof(CreateOnUtc))] //给 CratedOnUtc也+创建一个索引
[Table("Malema_Student")] //表名改成 Malema_Student
public class Student
{
[Key] //定义主键, 如果主键名是Id 话。就不需要添加这个Attribute了。
public int MaId { get; set; }
[StringLength(20)] //定义长度为 20
public string Name { get; set; }
[Column("NickName2", TypeName = "ntext")] // 定义 字段名 还有类型
public string NickName { get; set; }
public DateTime? CreateOnUtc { get; set; } //定义成了可空类型
[NotMapped] // 不需要映射到 数据表
public int? Age { get; set; }
public ICollection<StudentCourse> StudentCourses { get; set; }
}
public class StudentCourse
{
public int Id { get; set; }
public int StudentId1 { get; set; }
public int CourseId { get; set; }
// 定义外键的属性名称。用的是 StudentId1 如果按规范写的外键是StudentId我们不需要定义
[ForeignKey(nameof(StudentId1))]
public Student Student { get; set; }
public Course Course { get; set; }
}
生成的数据库如下
如何定义联合主键 5.0里面不允许使用多个Key一起定义联合主健。得使用Fluent API来定义
除了上面例子介绍到的 Index, Table,Key, StringLength, Column NotMapped. ForeignKey, 我们还有其它比较有用的一些特性 InverseProperty TimeStamp ConcurrencyCheck DatabaseGenerated 这些会后面单独介绍。
public class MalemaDbContext : DbContext
{
public MalemaDbContext(DbContextOptions<MalemaDbContext> options)
: base(options)
{
this.Database.EnsureCreated();
}
public DbSet<Student> Students { get; set; }
public DbSet<Course> Courses { get; set; }
public DbSet<StudentCourse> StudentCourses { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.HasDefaultSchema("Malema");
//modelBuilder.Entity<Course>().ToTable("Course_1"); //表名
modelBuilder.Entity<Course>().ToTable("Course_1", "dbo"); //表名和schema
base.OnModelCreating(modelBuilder);
}
}
会生成如下的数据库
Malema 这个是由 modelBuilder.HasDefaultSchema
配置的。
Course的表名变成了 Course_1 是由 modelBuilder.Entity<Course>().ToTable("Course_1","dbo")
控制。