首页 > 其他分享 >Entity Framwork Core (一)

Entity Framwork Core (一)

时间:2024-06-06 17:34:46浏览次数:14  
标签:Core 配置 Framwork Entity Books modelBuilder public 属性

ORM : Object Relational Mapping。让开发者用对象操作的形式操作关系数据库。

从面向数据库集中到面向对象。

Nuget

Microsoft.EntityFrameworkCore
//针对于sqlserver
Microsoft.EntityFrameworkCore.SqlServer
Microsoft.EntityFrameworkCore.Design
//在vs中需要装
Microsoft.EntityFrameworkCore.Tools

EFCore也是约定大于配置

基本操作步骤

  1. 建实体类;

     class Books
     {
         public long Id { get; set; }
         public string Title { get; set; }//标题
         public DateTime PubTime { get; set; }//发布日期
         public double Price { get; set; }//单价
     }
    
  2. 创建配置类;

    class BookConfig : IEntityTypeConfiguration<Books>
    {
        public void Configure(EntityTypeBuilder<Books> builder)
        {
            builder.ToTable("T_Books");
        }
    }
    
  3. 建DbContext;

    class MyDbConnect : DbContext
    {
        public DbSet<Books> Books { get; set; }
        public MyDbConnect(DbContextOptions options) : base(options)
        {
        }
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            base.OnConfiguring(optionsBuilder);
            optionsBuilder.UseSqlServer("Server =. ;Database=demo1; Trusted_Connection=True;MultipleActiveResultSets = true");
    
        }
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
            //从当前程序集中寻找实现IEntityTypeConfiguration<>接口的类
            modelBuilder.ApplyConfigurationsFromAssembly(this.GetType().Assembly);
        }
    }
    
  4. 生成数据库;

    //生成一次迁移
    Add-Migration <名称>
    //执行对操作数据库
    Update-Database
    
  5. 编写调用EF Core的业务代码;

    
    

EFCore数据的增删改查

插入数据

 using (MyDbConnect connect=new MyDbConnect())
 {
     Books book = new Books();
     book.AuthorName = "李名";
     connect.Books.Add(book);
     connect.SaveChanges();
 }

结合Linq查询数据

 private static async Task Main(string[] args)
 {
     using (MyDbConnect connect=new MyDbConnect())
     {
         IQueryable<Books> books = connect.Books.Where(e => e.Title == "围城");
         foreach (var item in books)
         {
             await Console.Out.WriteLineAsync(item.AuthorName);
         }
         await connect.SaveChangesAsync();
         Console.ReadKey();
     }
 }

删除和修改有点特殊

修改

要对数据进行修改,首先需要把要修改的数据查询出来,然后
再对查询出来的对象进行修改,然后再执行SaveChangesAsync()
保存修改。

var b=ctx.Books.Single(b=>b.Title == "数学之美”);
b.AuthorName = "Jun Wu";
await ctx.SaveChangesAsync();

删除

删除也是先把要修改的数据查询出来,然后再调用DbSet或者
DbContext的Remove方法把对象删除,然后再执行
SaveChangesAsync()保存修改。

var b=ctx.Books.Single(b=>b.Title == "数学之美”);
ctx.Remove(b);//也可以写成ctx.Books.Remove(b);
await ctx.SaveChangesAsync();

批量删除和修改EF7已经适配


约定配置

主要规则:

  1. 表名采用DbContext中的对应的DbSet的属性名。

  2. 数据表列的名字采用实体类属性的名字,列的数据类型

    采用和实体类属性类型最兼容的类型。

  3. 数据表列的可空性取决于对应实体类属性的可空性。

  4. 名字为Id的属性为主键,如果主键为short,int或者long类型,则默认采用自增字段,如果主键为Guid类型,则默认采用默认的Guid生成机制生成主键值。

两种配置方式

Data Annotation

把配置以特性(Annotation)的形式标注在实体类中。
模型注解
[Table("T_Books")]
public class Book
{
}
优点:简单;缺点:耦合。

Fluent API

builder.ToTable("T_Books");
把配置写到单独的配置类中。
缺点:复杂;优点:解耦
  • 视图与实体类映射:

    modelBuilder.Entity().ToView("blogsView");

  • 排除属性映射:忽略掉

    modelBuilder.Entity().Ignore(b=> b. Name2);

  • 配置列名:

    modelBuilder.Entity<Blog().Property(b=>b.BlogId).HasColumnName("blog_id");

  • 配置列数据类型:

    builder.Property(e => e.Title) .HasColumnType("varchar(200)")

  • 配置主键

    默认把名字为Id或者“实体类型+Id“的属性作为主键,可以用HasKey()来配置其他属性作为主键。modelBuilder.Entity().HasKey(c=>c.Number);

  • 生成列的值
    modelBuilder.Entity().Property(b =>
    b.Number). ValueGeneratedOnAdd();

  • 可以用HasDefaultValue()为属性设定默认值
    modelBuilder.Entity().Property(b =>
    b.Age).HasDefaultValue(6);

  • 索引
    modelBuilder.Entity().HasIndex(b=> b.Url);

  • 复合索引
    modelBuilder.Entity().HasIndex(p => new { p.FirstName,
    p.LastName });

  • 唯一索引:

    IsUnique();

    builder. HasIndex(b=>b.Title). IsUnique() ;
    builder. HasIndex(b=>new { b.Name2, b.AuthorName }) ;
    

    聚集索引:IsClustered()

  • 用EF Core太多高级特性的时候谨慎,尽量不要和业务逻辑混合在一起,以免“不能自拔”。比如Ignore、Shadow、Table Splitting等 ……

在实现IEntityTypeConfiguration<>接口的类中,可以定义些什么

  1. 设置表名:使用.ToTable("table_name")方法可以设置实体对应的数据库表名。
  2. 设置模式:使用.ToTable("table_name", "schema_name")方法可以设置模式(schema)。
  3. 配置主键:使用.HasKey(e => e.Id)方法可以设置实体的主键。
  4. 配置索引:使用.HasIndex(e => e.Property)方法可以为某个属性创建索引。
  5. 配置唯一约束:使用.HasAlternateKey(e => e.Property)方法可以为某个属性创建唯一约束。
  6. 配置关系:使用.HasOne(), .WithMany(), .HasForeignKey()等方法可以配置实体之间的关系,如一对多、多对多等。
  7. 配置属性:使用.Property(e => e.Property)可以对属性进行配置,如设置最大长度、精度、是否可空等。
  8. 忽略属性:使用.Ignore()方法可以忽略实体中的某个属性,使其不映射到数据库表中。
  9. 配置注释:使用.HasComment("comment")方法可以为表或列添加注释。
  10. 配置序列生成:使用.HasDefaultValueSql(), .ValueGeneratedOnAdd(), .ValueGeneratedOnAddOrUpdate()等方法可以配置属性的默认值或生成策略。
  11. 配置转换:使用.HasConversion()方法可以配置属性的数据库类型转换。
  12. 配置存储:使用.HasColumnName("column_name")可以设置属性映射到数据库表中的列名。
  13. 配置读取/写入:使用.ForSqlServerHasColumnType(), .ForSqlServerToTable()等方法可以为特定数据库提供者配置特定的属性。
  14. 配置继承:如果实体类型之间存在继承关系,可以使用.HasDiscriminator(), .HasBaseType()等方法来配置。
  15. 配置影子属性:使用.HasShadowProperty()可以为实体添加一个影子属性,它不会映射到数据库表中,但可以在应用中使用。

标签:Core,配置,Framwork,Entity,Books,modelBuilder,public,属性
From: https://www.cnblogs.com/guan-tou6/p/18235690

相关文章

  • C# .NET 6 使用WorkFlow Core 创建工作审批流
    1,背景工作流思想在上世纪60年代就有人提出过;70年代就有人开始尝试,但是由于当时许多的限制,工作流一直没有成功的被实现;80年代才出现第一批成功的工作流系统;90年代工作流技术走向了第一个发展高峰期;90年代后至今工作流出现了很多版本,但是主旨还是不变的,为了使我们的工作变得更......
  • C# .NET 6 使用WorkFlow Core 创建工作审批流
    1,背景工作流思想在上世纪60年代就有人提出过;70年代就有人开始尝试,但是由于当时许多的限制,工作流一直没有成功的被实现;80年代才出现第一批成功的工作流系统;90年代工作流技术走向了第一个发展高峰期;90年代后至今工作流出现了很多版本,但是主旨还是不变的,为了使我们的工作变得更......
  • .NET Core中灵活使用反射
    前言前段时间有朋友问道一个这样的问题,.NETCore中如何通过Attribute的元数据信息来调用标记的对应方法。我第一时间想到的就是通过C#反射获取带有CustomAttribute标记的类,然后通过依赖注入(DI)的方式获取对应服务的方法并通过反射动态执行类的方法,从而实现更灵活的编程方式。......
  • 从零开始的.NET项目(一)配置EFCore
    目标框架:.net6.0操作系统:macos编译器:Rider内容:配置EFCore,使用CodeFrist创建mssql数据库,并存入种子数据数据库准备如果使用的是vs编译器的话,其实就不用准备数据库了,直接用vs自带的数据库,嘎嘎好使......
  • ASP.NET Core应用程序9:使用内置的标签助手
      ASP.NETCore提供了一组内置的标签助手,可以应用最常用的元素转换。使用了内置的标签助手,就不必像前一章一样自己创建自定义标签助手。  本章描述了基本的内置标签助手,并解释了它们是如何用于转换锚、链接、脚本和图像元素的。还解释了如何缓存内容部分以及如何根据应用程......
  • 2024破解版CorelDRAW新功能揭秘+免费序列号激活码!
    CorelDRAW2024,作为全球最受欢迎的图形设计软件之一,自1989年首次面世以来,就以其强大的功能、易用的操作和卓越的稳定性赢得了广大设计师的喜爱。而最新版本的CorelDRAW2024,更是在原有的基础上,进行了全面的升级和优化,无论是功能还是性能,都有了质的飞跃。今天,就让我们一起来详细了......
  • 2024最新版CorelDRAW新功能揭秘+免费激活攻略!
    在数字图形设计行业,选择合适的工具软件对于提高工作效率和质量至关重要。设计师们追求的不仅仅是基础的绘图和设计功能,更期望软件能提供强大的集成解决方案,以适应不断变化的市场需求。在这样的背景下,CorelDRAW2024作为一款业界领先的矢量图形设计软件,以其全面的升级和新增功能......
  • bug记录——报了一堆xtr1common和yvals_core.h的错误
    现象        今天使用VisualStdio2022时,突然出现了这样严重的报错,看得我一头雾水,而且无法启动VisualStdio2022的调试。原因    发现NULL没法直接使用时,跟着提示添加了如下的头文件。        #include<cstddef>,是C++标准库的头文件,在C的文件中使......
  • .netCore System.Drawing.Common 发布,在CentOS 运行报错,生成图片流时。会因为不支持在
    报错:System.PlatformNotSupportedException:System.Drawing.Commonisnotsupportedonnon-Windowsplatforms.Seehttps://aka.ms/systemdrawingnonwindowsformoreinformation. >System.PlatformNotSupportedException:System.Drawing.Commonisnotsupported......
  • CSRedis用于Redis哨兵模式,NetCore
    十年河东,十年河西,莫欺少年穷学无止境,精益求精上一节通过两台windowsServer服务器部署了Redis的哨兵模式,详情参考:两台windowserver服务器配置Redis哨兵集群----一主二从redis通过主从复制来实现高可用,但是发生故障时需要人工进行主从切换,效率低下。哨兵机制实现了redis主从的自......