zoukankan      html  css  js  c++  java
  • 微软跨平台ORM框架之EFCore — 约定与属性映射

    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 = 11,
                    Status = true,
                    CreateTime = DateTime.Now,
                };
                var person2 = new Person()
                {
                    Name = "季某人",
                    Age = 11,
                    Status = true,
                    CreateTime = DateTime.Now,
                };
                var order = new Order()
                {
                    PersonID = 1,
                    Address = "地球XX",
                    Phone = "00000"
                };
                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(50)] // 列的长度
            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

  • 相关阅读:
    List<T>直接充当Combox控件DataSource并扩展自定义记录的方法
    List转Datatable 新方法
    CDM中,实体与实体快捷方式之间的联系不能重复,否则会造成外键重复
    PD中设置外键约束名称生成规则
    查询当前数据库用户会话信息
    Word中调整编号和文字的间距
    PDM/CDM中进行搜索
    PDM后续处理-驼峰规则、清除约束、外键改名
    列举当前用户或指定用户的所有表,所有字段,以及所有约束
    PDM中列举所有含取值范围、正则表达式约束的字段
  • 原文地址:https://www.cnblogs.com/jixiaosa/p/10328377.html
Copyright © 2011-2022 走看看