本节内容,涉及4.6(P84-P92)。主要NuGet包:如前述章节

 

一、配置映射关系,有两种方案,一是Data Annotation、二是如2.3节使用的Fluent Api,推荐使用Fluent Api。

 

二、Fluent Api的基本配置

//以下案例都在DbContext的OnModelCreating方法中配置,如下所示:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Article>(b =>
    {
        b.ToTable("T_Articles");
        b.Property(a => a.Title).HasMaxLength(50);
     });
}

//实体类与数据表或视图的映射
b.ToTable("T_Blogs");
b.ToView("V_Blogs");

//设置字段最大长度、必填和使用unicode字符(中文一般设置这个)
b.Propery(a => a.Name).HasMaxLength(100).IsRequired().IsUnicode();

//设置字段可空,不使用默认规则
b.Property(a => Remark).IsOptional();

//指定数据表字段名,不使用默认规则
b.Property(a => a.BlogId).HasColumnName("blog_id");

//指定数据表字段类型,不使用默认规则
b.Property(a => a.Title).HasColumnType("varchar(200)");

//排除某个属性的映射,即此属性不会建立数据表字段
b.Ignore(a => a.Name2);

//默认Id属性为主键,也可以设置主键,一般不建议这么干
b.HasKey(a => a.Number);

//设置索引,包括复合索引
b.HasIndex(a => a.Url);
b.HasIndex(a => new{a.FirstName,a.LastName});

//Fluent Api进行链式调用时,注意每种方法的返回值,如果返回值为同一种类型,则可以使用

 

三、主键设置

1、实际项目中,大多数使用以下两种:自增主键和Guid主键

2、自增主键:

  • 实体类中,Id属性类型设置为int或long类型时,按约定将Id设置为数据表中的自增主键。
  • 自增主键由数据库生成,所以在保存数据之前,即使用ctx.SaveChange方法前,Id值为默认值0。只有在数据保存之后,才可以获取Id值。
  • 自增主键是有序主键,自动设置为聚集索引,性能比较好,但因为不是跨数据表唯一,在分库合并、分布式应用时,会存在主键重复问题。
  • 自增主键是有顺序的,所以通过浏览器调用Api时,可以很容易通过Id号判断数据表和业务情况,也容易被恶意访问。

3、Guid主键

  • 实体类中,Id属性设置为Guid类型时,按约定将Id设置为Guid类型的主键。
  • Guid由服务器生成,①可以手动生成,如“a.Id = Guid.NewGuid()”;②调用ctx.Articles.Add()方法时,会自动生成。所以在保存数据之前,就可以获得Guid值。
  • Guid根据当前计算机和网络生成,全球唯一,在分库合并、分布式应用时,不存在重复问题,更加友好。但AspNetCoe创建的Guid值是无序的,所以不能设置为聚集索引,性能会差一些。而且一个Guid值很长,比Id更占空间,当然这点可以忽略不计。
  • 在AspNetCore中生成的Guid值是无序的,但现在有类库可以生成有序的Guid值,可以设置为聚集索引,这就解决了性能问题。同时,这些Guid值,即使有序了,但仍然是随机的,可以避免自增主键容易被猜透的问题。所以一些框架全部都使用Guid作为主键,比如ABP。

 

 

特别说明:
1、本系列内容主要基于杨中科老师的书籍《ASP.NET Core技术内幕与项目实战》及配套的B站视频视频教程,同时会增加极少部分的小知识点
2、本系列教程主要目的是提炼知识点,追求快准狠,以求快速复习,如果说书籍学习的效率是视频的2倍,那么“简读系列”应该做到再快3-5倍

 

原文地址:http://www.cnblogs.com/functionMC/p/16838194.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性