EF core 配置 Configurtions

在前面的章节中中了解了 EF Core 中的默认约定。 有些时候我们想自定义实体到表的映射,不想遵循默认约定。 EF Core 允许我们自定义这类的操作。(通常来说我们应该使用默认的约定,这叫约定大于配置 同样的使用 annotation attribute也会比fluent api好一点,更直观了)

有两种方法可以在 EF Core 中配置域类(与 EF 6 中相同)。

  1. 通过使用 数据批注特性 data annotation attribute
  2. 通过使用 Fluent API

数据批注 Data annotation attribute

数据注释是一种简单的基于特性的配置方法,可以将不同的 .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 这些会后面单独介绍。

使用 Fulent API 对实体进行配置

配置Schema 和配置表名

    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") 控制。

下一篇:EF core Timestamp
最近更新的
...