标签:set get Core02 builder EF public Address 主键
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算法
标签:set,get,Core02,builder,EF,public,Address,主键 来源: https://www.cnblogs.com/Zingu/p/15846869.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。