EF Core02

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算法

 

 

 

 

 

 

 

            

 

posted @ 2022-01-26 15:51  后跳  阅读(83)  评论(0编辑  收藏  举报