Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >张高兴的 Entity Framework Core 即学即用:(一)创建第一个 EF Core 应用

张高兴的 Entity Framework Core 即学即用:(一)创建第一个 EF Core 应用

作者头像
张高兴
发布于 2022-05-09 07:11:48
发布于 2022-05-09 07:11:48
2.6K00
代码可运行
举报
文章被收录于专栏:张高兴的博客张高兴的博客
运行总次数:0
代码可运行

写在前面

Entity Framework Core (EF Core) 是 .NET 平台流行的对象关系映射(ORM)框架。虽然 .NET 平台中 ORM 框架有很多,比如 Dapper、NHibernate、PetaPoco 等,并且 EF Core 的性能也不是最优的(这是由于 EF 的实体跟踪特性,将其禁用后可以大幅提升性能),但依然吸引到很多后端开发者的使用,原因如下:

  1. EF Core 由 .NET 官方进行开发维护,出现问题解决较为及时,这是很多国产 ORM 框架不具有的优势;
  2. EF Core 和 C# 语法高度绑定,使用 LINQ 不再需要编写复杂的数据库访问代码;
  3. EF Core 支持大部分流行的数据库,切换数据库时只需要更改数据库访问驱动,并不需要更改业务逻辑。 因此在项目中使用 EF Core 不一定是最优的,但一定不会错。

《张高兴的 Entity Framework Core 即学即用》系列博客将会从实践的角度去介绍 EF Core。由于学习的是数据库访问技术,因此还需要一个数据库供我们实践。将根据如下背景设计一个数据库,本系列博客将基于此数据库进行实践:

新冠肺炎的流行打破了人们原有的正常生活。为了更好地预防和控制疫情,我们决定开发一个病毒检测管理系统,用于记录公民的核酸检测报告。核酸检测在医院进行,所有检测报告将由病毒检测管理系统收集统计。当前有多家医院可以进行核酸检测,未来这些医院的数量也会增加。考虑到病毒的变异以及未来的扩展性,病毒检测管理系统还需要支持存储不同病毒的检测报告。核酸检测的流程由收集患者的基本信息开始,然后是收集样本的类型,最后出具带有医生姓名的核酸检测报告。

《张高兴的 Entity Framework Core 即学即用》系列博客使用 .NET 6 和 EF Core 6 进行编码,保证了技术的时效性。和绝大部分 EF Core 的教程不同,这里并没有选择使用 SQL Server,而是使用 PostgreSQL 数据库。此处并没有否认 SQL Server 是一款优秀的数据库,并且 EF 的很多特性在 SQL Server 上表现更好,可以说 SQL Server 是 EF Core 的最佳实践。但 SQL Server 最致命的问题是闭源并且收费,现在虽然可以跨平台运行,但这个方向仍有很长的路要走。PostgreSQL 开源且免费,甚至可以运行在 ARM 的 Linux 开发板上,性能也要优于 MySQL。PostgreSQL 扩展性高,拥有庞大的插件群,并且还具有一些“领先时代”的功能,可以说是数据库界的 C#。当然本系列博客并没有涉及到数据库的原生操作,如果你不想使用 PostgreSQL,可以直接将 NuGet 包替换成对应数据库的即可,这也是 EF Core 的优势。

《张高兴的 Entity Framework Core 即学即用》系列博客共分为 4 个部分:

  1. 第一部分将从 0 开始创建一个 EF Core 应用,介绍了使用 Database First 的方式以及手工的方式生成实体类,并且尝试查询一张表的数据;
  2. 第二部分介绍了 EF Core 的实体状态以及增删改查等数据库操作;
  3. 第三部分实现了一个 EF Core 的帮助类,以简化数据库的操作和增强扩展性;
  4. 第四部分使用 Razor 引擎实现了一个实体类生成工具。

每一篇博客在介绍功能点时都附带有简单的示例,每一章的最后还附有若干个小练习,希望读者可以借着练习帮助理解,之后根据项目中遇到的问题再学习其他的内容。欢迎批评与指正,有任何的问题都可以通过邮件或者评论的方式与我交流。

张高兴 2022年3月22日


本文将使用 .NET 6 创建一个控制台程序,从 0 开始,学习 EF Core 的使用。通过本文你可以学到:

  1. 使用 Database First 的方式生成实体类;
  2. 熟悉实体类中的 EF Core Attribute;
  3. 查询一张表的数据;
  4. 使用 Docker 拉取镜像。

目录

准备工作

准备工作包含两部分:安装数据库与创建数据库。EF Core 对 PostgreSQL 的版本没有要求,但后续的博客在介绍编写实体类生成工具时要求 12 及以上的版本。

安装 PostgreSQL

直接安装

PostgreSQL 支持在绝大多数操作系统下运行,下载地址:https://www.postgresql.org/download

Windows 下载 exe 安装包,安装时直接点击“下一步”即可,无需额外配置。如果使用 Debian 系列的 Linux 发行版时,直接使用 apt 进行安装,也无需其他操作。其他的操作系统建议根据下载地址中的安装指南进行操作。

使用 Docker 拉取镜像
  1. 拉取 PostgreSQL 镜像:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker pull postgres
  1. 创建卷,用于持久化数据库数据:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker volume create pgsql_data
  1. 运行镜像,端口映射为 54321,密码配置为弱密码 @Passw0rd
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker run -d --name pgsql -p 54321:5432 --restart=always -e POSTGRES_PASSWORD='@Passw0rd' -e TZ='Asia/Shanghai' -e ALLOW_IP_RANGE=0.0.0.0/0 -v pgsql_data:/var/lib/postgresql postgres

数据库的表结构

数据库的设计取决于业务的需求,对同样的业务,每个人的设计都有可能不同,数据库的设计并没有标准答案,读者们或许有更好的设计方案,这里给出的表结构仅供参考,只是为了满足教程的需要:

🛈 重要

表结构这里不过多的讲解,虽然使用 EF Core 并不需要掌握复杂的数据库知识,也不需要会写复杂的 SQL,但必要的表结构关系还是应该要理解。

下面使用熟悉的数据库管理工具,如 pgAdmin、Navicat 等,创建数据库 pandemic,具体的执行 SQL 如下,删减了字段注释等不必要的语句:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
create table doctor (
   id                   SERIAL not null,
   name                 VARCHAR(20)          not null,
   hospital_id          INT4                 not null,
   is_deleted           INT4                 not null default 0,
   creator_id           VARCHAR(50)          null,
   created_dt           TIMESTAMP            not null default 'now()',
   modifier_id          VARCHAR(50)          null,
   modified_dt          TIMESTAMP            not null default 'now()',
   constraint PK_DOCTOR primary key (id)
);
create table hospital (
   id                   SERIAL not null,
   name                 VARCHAR(20)          not null,
   is_deleted           INT4                 not null default 0,
   creator_id           VARCHAR(50)          null,
   created_dt           TIMESTAMP            not null default 'now()',
   modifier_id          VARCHAR(50)          null,
   modified_dt          TIMESTAMP            not null default 'now()',
   constraint PK_HOSPITAL primary key (id)
);
create table patient (
   id                   SERIAL not null,
   name                 VARCHAR(20)          not null,
   sex                  VARCHAR(10)          null,
   age                  INT2                 null,
   mobile               VARCHAR(15)          null,
   is_deleted           INT4                 not null default 0,
   creator_id           VARCHAR(50)          null,
   created_dt           TIMESTAMP            not null default 'now()',
   modifier_id          VARCHAR(50)          null,
   modified_dt          TIMESTAMP            not null default 'now()',
   constraint PK_PATIENT primary key (id)
);
create table report (
   id                   SERIAL not null,
   report_type_cd       VARCHAR(20)          not null,
   doctor_id            INT4                 not null,
   patient_id           INT4                 not null,
   result               BOOL                 not null default FALSE,
   collect_time         TIMESTAMP            null,
   test_time            TIMESTAMP            null,
   report_time          TIMESTAMP            null,
   description          VARCHAR(200)         null,
   is_deleted           INT4                 not null default 0,
   creator_id           VARCHAR(50)          null,
   created_dt           TIMESTAMP            not null default 'now()',
   modifier_id          VARCHAR(50)          null,
   modified_dt          TIMESTAMP            not null default 'now()',
   constraint PK_REPORT primary key (id)
);
create table report_type (
   cd                   VARCHAR(20)          not null,
   name                 VARCHAR(20)          null,
   description          VARCHAR(200)         null default 'covid',
   is_deleted           INT4                 not null default 0,
   creator_id           VARCHAR(50)          null,
   created_dt           TIMESTAMP            not null default 'now()',
   modifier_id          VARCHAR(50)          null,
   modified_dt          TIMESTAMP            not null default 'now()',
   constraint PK_REPORT_TYPE primary key (cd)
);

alter table doctor
   add constraint FK_DOCTOR_REFERENCE_HOSPITAL foreign key (hospital_id)
      references hospital (id)
      on delete restrict on update restrict;
alter table report
   add constraint FK_REPORT_REFERENCE_DOCTOR foreign key (doctor_id)
      references doctor (id)
      on delete restrict on update restrict;
alter table report
   add constraint FK_REPORT_REFERENCE_REPORT_T foreign key (report_type_cd)
      references report_type (cd)
      on delete restrict on update restrict;
alter table report
   add constraint FK_REPORT_REFERENCE_PATIENT foreign key (patient_id)
      references patient (id)
      on delete restrict on update restrict;

INSERT INTO report_type (cd, name) VALUES ('COVID-1', '新冠肺炎1号');
INSERT INTO report_type (cd, name) VALUES ('COVID-2', '新冠肺炎2号');
INSERT INTO report_type (cd, name) VALUES ('COVID-3', '新冠肺炎3号');
INSERT INTO report_type (cd, name) VALUES ('COVID-4', '新冠肺炎4号');
INSERT INTO report_type (cd, name) VALUES ('COVID-5', '新冠肺炎5号');

Code First 与 Database First

Code First 和 Database First 算是 EF 中比较有特色的功能。简单来说 Code First 是先编写 C# 实体类,EF 会根据实体类之间的关系创建数据库;Database First 是先设计和创建数据库,EF 根据数据库的表结构生成 C# 实体类。对于不熟悉数据库的开发者来说,Code First 似乎非常方便,不需要掌握数据库的知识也可以使用数据库进行开发。Code First 是被应用于领域驱动设计(Domain Driven Design)中的,由于作者并没有 DDD 的实践,因此无法评判 Code First 的实用性。实际上数据库设计有很多优秀的软件,如 PowerDesigner、Navicat Data Modeler 等,并不需要手动的编写创建数据库的 SQL,因此 Database First 是一种非常高效的方式。而 Code First 中手动编写实体类这一步是不可避免的,在大型项目中数十上百的实体类,这些工作量是不容小觑的。因此本文不会介绍 Code First 的有关操作。

创建一个 EF Core 应用

项目地址:https://github.com/ZhangGaoxing/ef-core-demo

项目结构

创建一个控制台应用和类库,项目结构如下:

Pandemic 为控制台应用,用于实践 EF Core 的有关操作;Pandemic.Models 为类库,用于提供数据库上下文和实体类。

项目依赖

Pandemic 需要引用项目 Pandemic.Models

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<ItemGroup>
  <ProjectReference Include="..\Pandemic.Models\Pandemic.Models.csproj" />
</ItemGroup>

Pandemic.Models 添加如下 NuGet 包引用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<ItemGroup>
  <PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="6.0.3" />
</ItemGroup>

使用 Scaffold-DbContext 命令生成实体类

接下来使用 Database First 的方式去生成实体类。Scaffold-DbContext 顾名思义译为“数据库上下文脚手架”,通过此命令生成实体类和数据库上下文。由于新版本的 .NET 已经不再集成 EF Core Tools 了,因此需要在项目中添加 NuGet 包 Microsoft.EntityFrameworkCore.Tools。下面切换到 Pandemic.Models,即提供实体类的项目中安装 NuGet 包 Microsoft.EntityFrameworkCore.Tools。安装完成后,打开 Visual Studio 中的 工具 - NuGet 包管理器 - 程序包管理器控制台 执行以下命令:

切换到项目 :

运行实体类生成命令 ,该命令的详细参数请参考 :

💡 提示

执行 Scaffold-DbContext 命令报错时,请将 Pandemic.Models 设为启动项目,并且将“程序包管理器控制台”中的“默认项目”也设置为 Pandemic.Models。

正常运行没有报错后,实体类与数据库上下文就生成完毕了。

之后打开数据库上下文 PandemicContext.cs,会发现其中还是有些许的问题,比如创建时间字段 created_dt 的默认值为 PostgreSQL 中的 now() 函数,但 EF 并没有将其识别出来:

还需要手动的进行一些调整:

由此可见 Database First 的最佳实践应该使用 SQL Server,这种错误只能希望微软在下一个版本尽快解决。

手动创建实体类

下面将手动编写两个实体类 Hospital.csDoctor.cs,以熟悉 EF Core Attribute 是如何将数据库表和实体类之间建立联系的。

实体属性

每一个实体类都有一组属性,EF Core 会将实体属性映射到数据库表中的列。

表的映射

对数据库表进行映射,使用 Table() Attribute。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[Table("hospital")]
public class Hospital { }
列的映射

对数据库表中的列进行映射,使用 Column() Attribute。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[Table("hospital")]
public class Hospital
{
    [Column("id")]
    public int Id { get; set; }
}
主键的映射

对数据库表中的主键进行映射,使用 Key() Attribute。当主键是自增键时,还需要设置 DatabaseGenerated() Attribute。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[Table("hospital")]
public class Hospital
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    [Column("id")]
    public int Id { get; set; }
}

使用上文介绍的 Attribute 完整的映射医院类 Hospital.cs 以及医生类 Doctor.cs

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[Table("hospital")]
public class Hospital
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    [Column("id")]
    public int Id { get; set; }

    [Column("name")]
    public string Name { get; set; }

    [Column("is_deleted")]
    public int IsDeleted { get; set; } = 0;

    [Column("creator_id")]
    public string CreatorId { get; set; }

    [Column("created_dt")]
    public DateTime CreatedDt { get; set; } = DateTime.Now;

    [Column("modifier_id")]
    public string ModifierId { get; set; }

    [Column("modified_dt")]
    public DateTime ModifiedDt { get; set; } = DateTime.Now;
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[Table("doctor")]
public class Doctor
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    [Column("id")]
    public int Id { get; set; }

    [Column("name")]
    public string Name { get; set; }

    [Column("hospital_id")]
    public int HospitalId { get; set; }

    [Column("is_deleted")]
    public int IsDeleted { get; set; } = 0;

    [Column("creator_id")]
    public string CreatorId { get; set; }

    [Column("created_dt")]
    public DateTime CreatedDt { get; set; } = DateTime.Now;

    [Column("modifier_id")]
    public string ModifierId { get; set; }

    [Column("modified_dt")]
    public DateTime ModifiedDt { get; set; } = DateTime.Now;
}
导航属性

导航(Navigation)属性是数据库表之间的关系在实体类中的体现。设置好实体类之间的导航属性后,可以通过导航属性轻松的查询到关联实体的数据。在设置导航属性之前,首先需要理清楚医院和医生存在着怎样的数量关系,医生是医院的附属,一家医院下面会有多名医生,因此医院和医生之间是一对多的关系。为了方便理解,下面只保留主键、外键和导航属性。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[Table("doctor")]
public class Doctor
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    [Column("id")]
    public int Id { get; set; }

    [Column("hospital_id")]
    public int HospitalId { get; set; }

    [ForeignKey("HospitalId")]
    public virtual Hospital Hospital { get; set; }
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[Table("hospital")]
public class Hospital
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    [Column("id")]
    public int Id { get; set; }

    public virtual List<Doctor> Doctors { get; set; }
}

数据库表之间通过外键建立数量关系,因此配置导航属性使用 ForeignKey() Attribute。

💡 提示

导航属性中的 virtual 关键字不是必须的,当使用懒加载(lazy loading)时才有意义。在任何时候都不建议使用懒加载,这会拖慢数据的查询速度。

创建数据库上下文

数据库上下文(DbContext)是 EF 不可或缺的一部分。DbContext 的实例表示程序与数据库的一个会话(session),通过 DbContext 实例对数据库中的数据进行修改和查询。

为了在程序中访问数据库 pandemic,使数据库表与创建的 C# 实体类建立映射,需要创建一个数据库上下文类 PandemicContext.cs,该类派生自 Microsoft.EntityFrameworkCore.DbContext

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class PandemicContext : DbContext
{
    public PandemicContext() { }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { }

    protected override void OnModelCreating(ModelBuilder modelBuilder) { }
}

OnConfiguring() 方法用于配置数据库的一些设置,比如连接字符串、日志等:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
    optionsBuilder.UseNpgsql("Server=127.0.0.1;Port=54321;Database=pandemic;User Id=postgres;Password=@Passw0rd;");
}

⚠️ 警告

不建议将密码以明文的方式暴露在程序中,在 .NET 中字符串并不是加密的,密码可能会短暂的出现在内存中,或是对程序的反编译都可能会造成密码的泄露。最优的解决方案是不使用密码进行身份验证,或是通过读取外部配置文件,这样也便于程序的维护。

OnModelCreating() 方法用于配置数据库表与实体类之间的映射。由于数据库表中配置了软删除标记 is_deleted,当 is_deleted = 1 时认为该条数据是删除的,因此还需要对获取的数据进行过滤,使用 HasQueryFilter() 方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Hospital>()
        .HasQueryFilter(x => x.IsDeleted == 0);
    modelBuilder.Entity<Doctor>()
        .HasQueryFilter(x => x.IsDeleted == 0);
    modelBuilder.Entity<Report>()
        .HasQueryFilter(x => x.IsDeleted == 0);
    modelBuilder.Entity<ReportType>()
        .HasQueryFilter(x => x.IsDeleted == 0);
    modelBuilder.Entity<Patient>()
        .HasQueryFilter(x => x.IsDeleted == 0);
}

数据库上下文中通常还包括每个实体类的 DbSet<TEntity> 属性。DbSet<TEntity> 是用于修改和查询实体的数据,对 DbSet<TEntity> 的 LINQ 查询会转换为对应数据库表的查询。最终的数据库上下文类 PandemicContext.cs 如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class PandemicContext : DbContext
{
    public DbSet<Hospital> Hospitals { get; set; }
    public DbSet<Doctor> Doctors { get; set; }
    public DbSet<Report> Reports { get; set; }
    public DbSet<ReportType> ReportTypes { get; set; }
    public DbSet<Patient> Patients { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseNpgsql("Server=127.0.0.1;Port=54321;Database=pandemic;User Id=postgres;Password=@Passw0rd;");
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Hospital>()
            .HasQueryFilter(x => x.IsDeleted == 0);
        modelBuilder.Entity<Doctor>()
            .HasQueryFilter(x => x.IsDeleted == 0);
        modelBuilder.Entity<Report>()
            .HasQueryFilter(x => x.IsDeleted == 0);
        modelBuilder.Entity<ReportType>()
            .HasQueryFilter(x => x.IsDeleted == 0);
        modelBuilder.Entity<Patient>()
            .HasQueryFilter(x => x.IsDeleted == 0);
    }
}

💡 提示

DbSet<TEntity> 属性并不是必须的,只是为了简化操作,在实例化数据库上下文后,仍然可以使用 Set<TEntity>() 方法获取实体类的 DbSet。

从数据库中查询

将实体类配置完关系以及创建数据库上下文后,就可以通过实例化数据库上下文对数据库进行操作。下面切换到 Pandemic 控制台应用查询 report_type 这张表中的数据:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using Pandemic.Models;
PandemicContext context = new PandemicContext();
var types = context.ReportTypes.ToList();

✏️ 练习

1. 试着编写剩下的实体类;

2. 比较一下 Database First 生成的实体类和数据库上下文,与手工编写的有何不同;

3. 不使用 DbSet<TEntity> 属性查询 report_type 表的数据。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-03-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Entity Framework Core 2.0 新特性
一.模型级查询过滤器(Model-level query filters)   ef core2.0包含了一个新特性,我们叫他模型级查询过滤器(Model-level query filters)。此特性允许使用Linq查询表达式直接定义在实体类型的元数据模型上。这样的过滤器会自动应用到任何LINQ查询所涉及的那些实体类型,包括间接引用的实体类型(对象引用,导航属性)。这个特性的一些常见应用是: 软删除-定义一个 IsDeleted 属性 多租户-定义一个 TenantId 属性 示例代码: 1 pub
晓晨
2018/06/22
1.9K0
.NET EF Core(Entity Framework Core)
1、Entity Framework Core(EF Core)是微软官方的ORM框架。优点:功能强大、官方支持、生产效率高、力求屏蔽底层数据库差异;缺点:复杂、上手门槛高、不熟悉EFCore的话可能会进坑。 2、Dapper。优点:简单,N分钟即可上手,行为可预期性强;缺点:生产效率低,需要处理底层数据库差异。 3、EF Core是 模型驱动 (Model-Driven)的开发思想,Dapper是 数据库驱动(DataBase-Driven)的开发思想的。没有优劣,只有比较。 4、性能: Dapper等≠性能高;EF Core≠性能差。 5、EF Core是官方推荐、推进的框架,尽量屏蔽底层数据库差异,.NET开发者必须熟悉,根据的项目情况再决定用哪个。
鱼找水需要时间
2024/03/23
7050
.NET EF Core(Entity Framework Core)
Entity Framework Core 2.0 新特性
本文介绍了EF Core 2.0的新特性和改进,包括实体、表、查询、性能提升和查询方面的内容。
GuZhenYin
2018/01/04
4K0
Entity Framework Core 2.0 入门
LearnEf.Console依赖LearnEf.Domains和LearnEf.Data:
solenovex
2018/03/12
3.6K0
Entity Framework Core 2.0 入门
EntityFramework Core 学习扫盲
0. 写在前面 本篇文章虽说是入门学习,但是也不会循规蹈矩地把EF1.0版本一直到现在即将到来的EF Core 2.0版本相关的所有历史和细节完完整整还原出来。在后文中,笔者会直接进入正题,所以这篇文章仍然还是需要一定的EF ORM基础。 对于纯新手用户,不妨先去看看文末链接中一些优秀博客,笔者当初也是从这些博客起家,也从中得到了巨大的帮助。当然了,官方教程同样至关重要,笔者之前也贡献过部分EF CORE 官方文档资料(基本都是勘误,逃…),本篇文章中很多内容都是撷取自官方的英文文档和示例。 下文示例中
潘成涛
2018/01/18
9.7K0
01-EF Core笔记之创建模型
使用EF Core的第一步是创建数据模型,模型建的好,下班走的早。EF Core本身已经设置了一系列约定来帮我们快速的创建模型,例如表名、主键字段等,毕竟约定大于配置嘛。如果你想改变默认值,很简单,EF Core提供了Fluent API或Data Annotations两种方式允许我们定制数据模型。
拓荒者IT
2019/09/23
3.2K0
03-EF Core笔记之查询数据
微软提供了一百多个示例来演示查询,地址:https://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b
拓荒者IT
2019/09/23
2.6K0
Entity Framework Core 实现全局查询过滤
微软在 Entity Framework Core 2+ 中引入了全局查询过滤器,简化了构建多租户应用程序和实体软删除的复杂度。这篇文章我将通过代码的形式对全局过滤查询进行详细的讲解。在讲解前我们先来简单说一下什么是多租户,所谓多租户简单来说是指一个单独的实例可以为多个组织服务。多租户技术为共用的数据中心内如何以单一系统架构与服务提供多数客户端相同甚至可定制化的服务,并且仍然可以保障客户的数据隔离。 接下来我们先来看一个例子,我们假定多个租户使用同一个数据库,同一个Schema,区分租户是根据表中的 tId 区分。我们新建一个项目,在项目中重写 DbContext 上下文里的 OnModelCreating 方法,在这个方法中我们使用 HasQueryFilter 方法进行软删除。
喵叔
2020/09/08
1.1K0
C#-EF Core使用MySQL数据库
Entity Framework Core (EF Core)是微软推荐的基于.NET Core 的应用程序数据访问技术。开源,轻量级,可扩展并且支持跨平台开发。EF Core是一种对象关系映射器(ORM),通过应用程序实体对象和关系数据库中的数据的映射,使得开发人员能够以面向对象的方式处理数据。
kdyonly
2023/03/03
1.7K0
.NET 云原生架构师训练营(模块二 基础巩固 EF Core 基础与配置)--学习笔记
Entity Framework Core:https://docs.microsoft.com/zh-cn/ef/core/
郑子铭
2020/12/28
8040
.NET 云原生架构师训练营(模块二 基础巩固 EF Core 基础与配置)--学习笔记
Entity Framework Core 之数据库迁移
前言 最近打算用.NET Core写一份开源的简易CMS系统,来练练手 所以又去深入研究了一下Entity Framework Core  发现其实有些细节园子里还是很少讲到. 特意整理了几个细节. 正文 1.数据库迁移 先了解一下什么是"数据库迁移",它提供了一种方法,可以逐步将Code First的实体架构更改应用于数据库,以保持数据库与EF Core模型同步,同时保留数据库中的现有数据。 EF Core的数据迁移相对EF6来说改了不少也简化了一些.所以我们现在就来看看如何进行数据迁移 我们以官方代码来
GuZhenYin
2018/03/30
1.1K0
Entity Framework Core 之数据库迁移
EF Core中的多对多映射如何实现?
EF 6.X中的多对多映射是直接使用HasMany-HasMany来做的。但是到了EF Core中,不再直接支持这种方式了,可以是可以使用,但是不推荐,具体使用可以参考《你必须掌握的EntityFramework 6.X与Core 2.0》一文。在这里我就详细的说下如何在EF core下实现。 首先就是实体类的建立:
Ryan_OVO
2023/10/19
4950
Mysql 该如何 Entity Framework 数据库迁移 和 如何更好的支持EF.Extended
问题 1.在使用EntityFramework访问Mysql的时候,使用迁移来生成数据库或者更新数据库时候会遇到一些问题 2.EntityFramework.Extended对Mysql的支持不是很完全,其中修改是无法直接使用的需要做一些处理 3.EntityFramework.Extended如何跟EntityFramework其他的操作在一个事物里面(针对网友zengfanlin 问题) 解决方案 1.首先解决第一个问题 准备条件:用Nuget下载Mysql.Data.Entity(可以将依赖连同下载)
逸鹏
2018/04/11
1.8K0
Mysql 该如何 Entity Framework 数据库迁移 和 如何更好的支持EF.Extended
C# 数据操作系列 - 8. EF Core的增删改查
到目前为止,我们看了一下如何声明EF Core的初步使用,也整体的看了下EF Core的映射关系配置以及导航属性的配置。
程序员小高
2020/05/21
3.3K0
Entity Framework 4.1 Code-First 学习笔记
  CodeFirst提供了一种先从代码开始工作,并根据代码直接生成数据库的工作方式。Entity Framework 4.1在你的实体不派生自任何基类、不添加任何特性的时候正常的附加数据库。另外呢,实体的属性也可以添加一些标签,但这些标签不是必须的。下面是一个简单的示例:
拓荒者IT
2019/09/25
1.7K0
Entity Framework 约定
约定,类似于接口,是一个规范和规则,使用Code First 定义约定来配置模型和规则。在这里约定只是记本规则,我们可以通过Data Annotaion或者Fluent API来进一步配置模型。约定的形式有如下几种:
喵叔
2020/09/08
1.3K0
.NET 云原生架构师训练营(模块二 基础巩固 EF Core 关系)--学习笔记
2.4.4 EF Core -- 关系 一对多 一对一 多对多 示例 关系:https://docs.microsoft.com/zh-cn/ef/core/modeling/relationship
郑子铭
2020/12/29
5680
.NET 云原生架构师训练营(模块二 基础巩固 EF Core 关系)--学习笔记
每个 .NET 开发人员解决常见问题时都应该了解的 5 个 EF Core 功能
Entity Framework Core (EF Core) 为希望以高效可靠的方式与数据库交互的 .NET 开发人员带来了翻天覆地的变化。通过将复杂的 SQL 查询转换为简单的 C# 代码,EF Core 消除了处理数据的许多麻烦。但问题是 — 许多开发人员没有充分利用 EF Core 提供的强大功能。今天,我将分享 EF Core 的 5 项功能,这些功能可以解决开发人员的实际问题并显著提高您的工作效率。
郑子铭
2025/01/02
1750
每个 .NET 开发人员解决常见问题时都应该了解的 5 个 EF Core 功能
C#进阶-Entity Framework 5 原理与使用详解
本文详细介绍了Entity Framework 5(EF5)在C#中的使用方法,包括EF5的基本概念、与其他持久层框架的比较、基本语法和高级语法的使用,并通过实例讲解了如何在项目中集成和使用EF5。作为微软提供的ORM(对象关系映射)框架,EF5在简化数据库操作、提高开发效率方面发挥了重要作用。本文还将深入探讨EF5的核心原理,通过内部代码展示其工作机制。最后,总结了EF5的优缺点及其在实际开发中的应用场景,为开发者提供全面的指导。
Damon小智
2024/08/17
3081
C#进阶-Entity Framework 5 原理与使用详解
Entity Framework Repository模式
如果我们用最原始的EF进行设计对每个实体类的“C(增加)、R(读取)、U(修改)、D(删除)”这四个操作。
aehyok
2018/09/11
1.1K0
Entity Framework Repository模式
相关推荐
Entity Framework Core 2.0 新特性
更多 >
LV.1
这个人很懒,什么都没有留下~
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验