EF Core约定大于配置:
1.表名采用DbContext中对应的DBSet<T>属性的 属性名
例如:public DbSet<Student> Students { get; set; } 若不单独对表名进行设定则默认为表名=Students
2.数据库的列名与实体类属性名一致,列的类型采用和实体属于最兼容的类型
例如: SqlServer中: int = int (C#中) bigint = long(C#中)
3.数据库表列可空取决于实体类属性是否可空。 例如 public string? Address { get; set; } 则Address 可为空
4.名字为ID的属性作为主键,如果主键为Short/int/long类型,则默认采用自增字段。如果为GUID则默认采用Guid生成主键
实体类与数据库列的两种配置方式:
第一种:System.ComponentModel.DataAnnotations
[Table("ZuStudent")] internal class Student { public long Id { get; set; }
[Required] [MaxLength(60)] public string Name { get; set; } public int Age { get; set; } [Column("Loaction")] public string? Address { get; set; } /// <summary> /// 0:女 1:男 /// </summary>
[NotMapped] //不对应到表,表中不生成该字段 public int Gender { get; set; } public override string ToString() { var gender= Gender == 0?"女": "男"; return $"My Name is {Name},I'm a {gender},{Age} Years Old , Live in {Address} "; } }
第二种(推荐):FluentAPI 创建一个类单独进行配置,降低耦合
internal class StudentConfig : IEntityTypeConfiguration<Student> { public void Configure(EntityTypeBuilder<Student> builder) { builder.ToTable("ZuStudent");//设置表名,不写默认为类名 //系统自动把ID设置为主键了,所以不需要了 //builder.HasKey(t => t.Id); //设置主键 //builder.Property(x => x.Id).ValueGeneratedNever(); //设置自增 builder.Property(s => s.Name).HasMaxLength(60); //设置Name字段在数据库的长度 builder.Ignore(s=>s.Gender); //不对应到表,表中不生成该字段
builder.HasIndex(s=>s.Address).IsUnique();//唯一索引
builder.HasIndex(s => new {s.Name,s.Age });//复合索引
//一般不建议这样设置 builder.Property(s => s.Address).HasColumnName("Loaction");//设置Address属性 对应数据库的字段Location // } }
EF Core主键:
1.自增ID
优点:简单、适合创建索引,方便查询
缺点:分布式数据库中数据整合不方便,并发性能差
2.Guid
优点:简单、高并发。适用于分布式
缺点:占用空间,不适合设置为索引
总结:
SQLServer等数据库中不要把Guid主键设置为聚集索引,在MySql中,插入频繁的表不要用Guid作为主键
其他方案:
1.混合自增和Guid主键,自增作为物理主键,而Guid作为逻辑主键。
自增ID作为表的主键,而业务查询数据把当做主键使用
2.Hi/Lo算法