EFCore中的约定简单来说就是规则,CodeFirst基于模型的约定来映射表结构。除此之外还有Fluent API、Data Annotations(数据注释) 可以帮助我们进一步配置模型。

按照这三者的优先级高低排序分别是:Fluent API、Data Annotations(数据注释)、约定。

1.约定

public class Person
{
public int ID { get; set; }
public int Age { get; set; }
public bool Status { get; set; }
public string Name { get; set; }
public DateTime CreateTime { get; set; }
}

1.1 主键约定

我们有这样的一个Person类,在实体中如果有名为ID的字段,或者实体名+ID的字段如:PersonID,那么EFCore生成的表会自动标识为主键。并且如果它的类型是int或Guid则会默认自增长。

映射之后的表结构:

我们可以看到C#中的int、bool、string、datetime,分别映射为 int,bit,navarchar(MAX),datetime2(7)。这是因为EFCore的默认约定是这么规定的。道友们可能会想自定义的映射,比如把string映射会varcher,datetime映射为datetime。嗯。。这就需要借助Fluent API或Data Annotations了。

1.2 外键约定

新建一个订单类,并添加Person类型的字段,以及PersonID(以类名+ID的形式),并在上下文中注册。EFCore在映射表时会根据我们给定Person类型和PersonID来添加外键约束。

  public class Order
{
public Guid ID { get; set; }
public int PersonID { get; set; }
public Person Person { get; set; }
public string Address { get; set; }
public string Phone { get; set; }
}

修改Progarm.cs代码

class Program
{
static void Main(string[] args)
{ var context = new CoreDbContext();
// 删除数据库
context.Database.EnsureDeleted();
// 告诉EFCore我们要创建数据库
context.Database.EnsureCreated();
// 初始化数据
var person = new Person()
{
Name = "季某人",
Age = ,
Status = true,
CreateTime = DateTime.Now,
};
var person2 = new Person()
{
Name = "季某人",
Age = ,
Status = true,
CreateTime = DateTime.Now,
};
var order = new Order()
{
PersonID = ,
Address = "地球XX",
Phone = ""
};
context.Person.Add(person);
context.Person.Add(person2);
// 这里因为添加了外键,所以要先保存Person,不然会报外键的错误
context.SaveChanges();
context.Order.Add(order);
context.SaveChanges(); //Console.WriteLine("Hello World!");
}
}

启动项目,然后查看数据库。

可以看到数据完成了初始化,并且添加了外键约束。

2.Data Annotations(数据注释)

数据注释就是在属性上添加一些特性标签,告诉EFCore我们要映射的类型是什么样的,当默认的映射不能满足我们的需求时,就可以使用数据注释了。例如前面的映射,string类型映射为数据库的nvarchar(max),DateTime映射为datetime2(7)。 使用数据注释可以改变为我们想要映射成的类型,例如:string映射成varvhar。

添加一个新类OrderDetail,并添加数据注释。

 public class OrderDetail
{
[Key] // 标识主键
public int ID { get; set; }
[Column(TypeName = "varchar(50)")] // 列的数据类型
[Required] // 必填列
public string Price { get; set; }
public DateTime? CreateTime { get; set; }
[Column("OrderCode")] // 列的显示名字
[StringLength()] // 列的长度
public string Code { get; set; }
public Guid? OrderID { get; set; } public Order Order { get; set; } }

启动项目,观察映射成的表结构。与实体中的配置一样。

基本常用的就这些,其他的用到的时候可以去官网文档上找。

3.Fluent API

Fluent API 相较于 数据注释更加灵活。它的配置需要写在自定义的上下文类中的OnModelCreating方法中。

比如改变表名,数据类型之类的

效果和数据注释是一样的,值得注意的是当Fluent API 和数据注释同时配置一个属性时,Fluent API会覆盖掉数据注释。

除了上述之外还可以利用Fluent API 统一表的命名规范:例如 "T_+实体名".

  protected override void OnModelCreating(ModelBuilder modelBuilder)
{
foreach (var item in modelBuilder.Model.GetEntityTypes())
{
modelBuilder.Entity(item.Name).ToTable("T_" + item.ClrType.Name);
}
}

遍历要映射的实体然后加上 "T_" 前缀。

具体差异可以观看微软EFCore文档,传送门:https://docs.microsoft.com/zh-cn/ef/core/modeling/relational/data-types

微软跨平台ORM框架之EFCore — 约定与属性映射的更多相关文章

  1. 微软跨平台ORM框架之EFCore

    EFCore是微软推出的跨平台ORM框架,想较于EF6.X版本,更加轻量级.EFCore目前已经更新到2.x. 接下来用CodeFirst的方式来使用EFCore. 1.创建控制台程序 2.引入EFC ...

  2. c# 国内外ORM 框架 dapper efcore sqlsugar freesql hisql sqlserver数据常规插入测试性能对比

    c# 国内外ORM 框架 dapper efcore sqlsugar freesql hisql sqlserver数据常规插入测试性能对比对比 在6.22 号发布了 c# sqlsugar,his ...

  3. 微软跨平台UI框架MAUI真的要来啦

    .NET 6 preview已经上线,是时候为在BUILD 2020上宣布的新.NET Multi-platform App UI(MAUI)做准备了.对于客户端应用程序开发人员来说,这一年.NET有 ...

  4. Mego(2) - NET主流ORM框架分析

    接上文我们测试了各个ORM框架的性能,大家可以很直观的看到各个ORM框架与原生的ADO.NET在境删改查的性能差异.这里和大家分享下我对ORM框架的理解及一些使用经验. ORM框架工作原理 典型ORM ...

  5. .NET 跨平台RPC框架DotNettyRPC Web后台快速开发框架(.NET Core) EasyWcf------无需配置,无需引用,动态绑定,轻松使用 C# .NET 0配置使用Wcf(半成品) C# .NET Socket 简单实用框架 C# .NET 0命令行安装Windows服务程序

    .NET 跨平台RPC框架DotNettyRPC   DotNettyRPC 1.简介 DotNettyRPC是一个基于DotNetty的跨平台RPC框架,支持.NET45以及.NET Standar ...

  6. .NET ORM框架HiSql实战-第一章-集成HiSql

    一.引言 做.Net这么多年,出现了很多很多ORM框架,比如Dapper,Sqlsugar,Freesql等等.在之前的项目中,用到的ORM框架也大多数是这几个老牌的框架. 不过最近园子关于.NET ...

  7. 自定义ORM框架(转转)

    ORM背景 在数据库界,主流的数据库都是关系型数据库,其采用的关系型数据结构模型,无论从数学上还是实践中都相当的成熟,得到非常广泛的应用.在关系型数据结构理 论中,所有的数据都组织成一个个相互独立的二 ...

  8. ORM框架之SQLALchemy

    一.面向对象应用场景: 1.函数有共同参数,解决参数不断重用: 2.模板(约束同一类事物的,属性和行为) 3.函数编程和面向对象区别: 面向对象:数据和逻辑组合在一起:函数编程:数据和逻辑不能组合在一 ...

  9. EFCodeFirst属性映射约定

    EFCodeFirst属性映射约定 EFCodeFirst 属性映射约定 CodeFirst与数据表之间得映射方式又两种:Data Annotation和Fluent API 默认约定: 表名为类名的 ...

随机推荐

  1. Eclipse 4.2 安装Java反编译插件

    在eclipse下安装反编译插件可以直接查看 .class 文件对应的java源码. 反编译插件有 jdeclipse 和 jadeclipse. (1) jdeclipse http://www.d ...

  2. 巩固java(五)----通过实例理解java多态

    package duotai; class A{ public String show(){ return "A"; } } class B extends A{ public S ...

  3. 12.app后端如何选择合适的数据库产品

    app后端的开发中,经常要面临的一个问题是:数据放在哪里? mysql ?redis?mongodb? 现在有这么多优秀的开源数据库产品,怎么根据业务场景来选择合适的数据? 常用的数据库产品的优缺点又 ...

  4. 解决vi上下左右变ABCD问题

      第一步执行sudo apt-get install vim,如果没有出现错误,再次进入vi 尝试一下,看看有没有修改过来,如果出现以下错误E: Package 'vim' has no insta ...

  5. 再谈DOMContentLoaded与渲染阻塞—分析html页面事件与资源加载

    浏览器的多线程中,有的线程负责加载资源,有的线程负责执行脚本,有的线程负责渲染界面,有的线程负责轮询.监听用户事件. 这些线程,根据浏览器自身特点以及web标准等等,有的会被浏览器特意的阻塞.两个很明 ...

  6. DDD实战进阶第一波(十一):开发一般业务的大健康行业直销系统(实现经销商代注册用例与登录令牌分发)

    前两篇文章主要实现了经销商代注册的仓储与领域逻辑.经销商登录的仓储与相关逻辑,这篇文章主要讲述经销商代注册的用例与经销商登录的查询功能. 一.经销商代注册用例 在经销商代注册用例中,我们需要传递经销商 ...

  7. java编程思想-第五章-某些练习题

    参考https://blog.csdn.net/caroline_wendy/article/details/46844651 10&11 finalize()被调用的条件 Java1.6以下 ...

  8. js生成带logo的二维码

    作为一名java程序员,一直以来都是使用服务端生成二维码,最近接触前端的设计,感觉二维码这块如果放到前端去生成,一方面可以减轻服务端的压力,访问带宽,另一方面,前端页面控制比较顺畅 闲话少叙,说下我的 ...

  9. 将外部dwg图纸中指定带属性的块插入到当前图纸中

    static void InsertBlock() { //获取要插入的块名 TCHAR str[40]; acedGetString(Adesk::kFalse, _T("\n请输入要插入 ...

  10. BZOJ_3174_[Tjoi2013]拯救小矮人_贪心+DP

    BZOJ_3174_[Tjoi2013]拯救小矮人_贪心+DP Description 一群小矮人掉进了一个很深的陷阱里,由于太矮爬不上来,于是他们决定搭一个人梯.即:一个小矮人站在另一小矮人的 肩膀 ...