• 4.EF Core 数据库映射模型基本配置


    一、Fluent API 方式

    1、重写 OnModelCreating 使用 Fluent API 配置模型class MyContext : DbContext

     {
       public DbSet<Blog> Blogs { get; set; }
       protected override void OnModelCreating(ModelBuilder modelBuilder)
       {
          modelBuilder.Entity<Blog>() .ToTable("blogs"); //设置映射的数据库表名
          modelBuilder.Entity<Blog>() .ToTable("blogs", schema: "blogging"); //表在数据库的架构中创建
          modelBuilder.HasDefaultSchema("blogging"); //在模型级别定义 Fluent API 的默认架构,不用每个表指定架构:

          modelBuilder.Ignore<BlogMetadata>(); //排除BlogMetadata实体模型的数据库映射
          modelBuilder.Entity<Car>().HasKey(c => c.LicensePlate); ////主键  按照约定,将名为 Id 或 <type name>Id 的属性配置为实体的主键,如  Id 或 TruckId;类型为 short、int、long、或 Guid 的非复合主键会被设置在添加时生成值。 所有其他属性会被设置为不生成值。
          modelBuilder.Entity<Car>().HasKey(c => new { c.State, c.LicensePlate }); //设置复合主键
           modelBuilder.Entity<Blog>().Property(b => b.BlogId).ValueGeneratedNever(); //不生成值
           modelBuilder.Entity<Blog>().Property(b =>b.Inserted).ValueGeneratedOnAdd();  //添加时生成值
            modelBuilder.Entity<Blog>().Property(b =>b.LastUpdated).ValueGeneratedOnAddOrUpdate(); //添加或更新时生成值
          modelBuilder.Entity<Blog>()
           .Property(b => b.Url)
           .HasColumnName("blog_id") //设置对应数据表字段的列名
           .HasColumnType("varchar(200)") //设置数据表字段的类型
           .HasMaxLength(500) //最大长度 适用string 和 byte[]       .IsRequired() // 必填

    //并发出现脏数据处理,有两种方式,出现脏数据后都会抛出异常,需要自己处理
            //1.添加乐观锁        
            modelBuilder.Entity<Person>().Property(p => p.LastName).IsConcurrencyToken(); //标记乐观锁,防止脏数据,如果出现并发,会抛出异常
                 //2.时间戳和行版本,每次插入或更新行时,数据库生成一个时间戳,该属性也被视为并发标记,需要在模型中定义 public byte[] Timestamp { get; set; } 字段
            modelBuilder.Entity<Blog>().Property(p => p.Timestamp).IsRowVersion();
    
       }
     }

     2、新建模型配置类

    a.继承IEntityTypeConfiguration接口

        public class BlogConfig : IEntityTypeConfiguration<Blog>
        {
            public  void Configure(EntityTypeBuilder<Blog> builder)
            {
                builder.ToTable("Blog");
                builder.Property(b => b.Remark).HasMaxLength(40);
            }
        }

    b.重写 OnModelCreating添加配置类类型

    class MyContext : DbContext
     {
       public DbSet<Blog> Blogs { get; set; }
       protected override void OnModelCreating(ModelBuilder modelBuilder)
       {
          base.OnModelCreating(modelBuilder);
            modelBuilder.ApplyConfigurationsFromAssembly(Assembly.Load("配置类所在dll名"));   
      }
    }

    二、Data Annotations 数据注释方式

    [Table("blogs")]  //标注在类上,设置映射的表名
    
    [Table("blogs", Schema = "blogging")]   //表在数据库的架构中创建
    
    [NotMapped]  //标注在类上,不生成表的映射
    [NotMapped]  //标注在类的属性上,排除此属性的数据库表字段
    [Key]    //主键  按照约定,将名为 Id 或 <type name>Id 的属性配置为实体的主键,如  Id 或 TruckId;类型为 short、int、long、或 Guid 的非复合主键会被设置在添加时生成值。 所有其他属性会被设置为不生成值。
    复合主键,无法使用约定和 Data Annotations 设置复合键,只能使用 Fluent API 设置
    [Column("blog_id")]  //设置对应数据表字段的列名
    [Column(TypeName = "varchar(200)")]  //设置数据表字段的类型
    [MaxLength(500)]  //最大长度 适用string 和 byte[]
    [Required] //必填
     
    [DatabaseGenerated(DatabaseGeneratedOption.None)]  //不生成值
    public int BlogId { get; set; }
     
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]  //在添加时生成值
    public DateTime Inserted { get; set; }
     
    [DatabaseGenerated(DatabaseGeneratedOption.Computed)]  //在添加或更新时生成值,使用 Computed 无法赋值,只能通过计算获得。
    public DateTime LastUpdated { get; set; }
     
     并发出现脏数据处理,有两种方式,出现脏数据后都会抛出异常,需要自己处理
    1.添加乐观锁
    [ConcurrencyCheck]  //标记乐观锁,防止脏数据,如果出现并发,会抛出异常
     2.时间戳和行版本
    [Timestamp]
    public byte[] Timestamp { get; set; }   //每次插入或更新行时,数据库生成一个时间戳,该属性也被视为并发标记
  • 相关阅读:
    dataframe字段过长被截断
    sublime text 3安装Anaconda插件之后写python出现白框
    在tkinter中使用matplotlib
    RemoteDisconnected: Remote end closed connection without response
    object of type 'Response' has no len()
    matploylib之热力图
    pycharm格式化python代码快捷键Ctrl+Alt+L失效
    Windows下Redis集群配置
    七牛云--对象存储
    Spring发送邮件
  • 原文地址:https://www.cnblogs.com/Adoni/p/12295074.html
Copyright © 2020-2023  润新知