Entity Framework Core

文章目录

  • 前言
  • 模型
  • EF O/RM 注意事项
  • 当你的Enitiy 修改了字段, EFCore 处理
  • 总结


前言

EFCore 常见功能,Entity Framework (EF) Core 是轻量化、可扩展、开源和跨平台版的常用 Entity Framework 数据访问技术。

EF Core 可用作对象关系映射程序 (O/RM),这可以实现以下两点:

使 .NET 开发人员能够使用 .NET 对象处理数据库。
无需再像通常那样编写大部分数据访问代码。


模型

对于 EF Core,使用模型执行数据访问。 模型由实体类和表示数据库会话的上下文对象构成。 上下文对象允许查询并保存数据。

EF 支持以下模型开发方法:

  • 从现有数据库生成模型。

  • 对模型手动编码,使其符合数据库。

  • 创建模型后,使用 EF 迁移从模型创建数据库。 模型发生变化时,迁移可让数据库不断演进。

EF O/RM 注意事项

虽然 EF Core 善长提取许多编程详细信息,但还是有一些适用于任何 O/RM 的最佳做法,可帮助避免生产应用中的常见陷阱:

  • 若要在高性能生产应用中构建、调试、分析和迁移数据,必须具备基础数据库服务器的中级知识或更高级别的知识。
    例如,有关主键和外键、约束、索引、标准化、DML 和 DDL 语句、数据类型、分析等方面的知识。

  • 功能和集成测试:请务必尽可能严密地复制生产环境,以便:

    • 查找仅在使用特定版本的数据库服务器时应用才出现的问题。
    • 在升级 EF Core和其他依赖项时捕获中断性变更。 例如,添加或升级 ASP.NET Core、OData 或 AutoMapper 等框架。 这些依赖项可能以多种意外方式影响 EF Core。
  • 通过代表性负载进行性能和压力测试。 某些功能的不成熟用法缩放性不佳。
    例如,多项集合包含内容、大量使用延迟加载、对未编制索引的列执行条件查询、对存储生成的值进行大规模更新和插入、缺乏并发处理、大型模型、缓存策略不充分。

  • 安全评审:例如,连接字符串和其他机密处理、非部署操作的数据库权限、原始 SQL 的输入验证、敏感数据加密。

  • 确保日志记录和诊断充足且可用。 例如,适当的日志记录配置、查询标记和 Application Insights。

  • 错误恢复。 为常见故障场景(如版本回退、回退服务器、横向扩展和负载平衡、DoS 缓解和数据备份)准备应急计划。

  • 应用程序部署和迁移。
    规划如何在部署过程中应用迁移;在应用程序启动时执行此操作可能会导致并发问题,并且对于常规操作,这所需的权限比必要权限更高。
    在迁移期间,使用暂存来辅助从错误中恢复。

  • 生成的迁移的详细检查和测试。 将迁移应用于生产数据前,应对其进行全面测试。 若表中包含生产数据,架构的形状和列类型就不能轻易更改。
    例如,在 SQL Server 上,对于映射到字符串和十进制属性的列,nvarchar(max) 和 decimal(18, 2)
    极少成为最佳类型,但这些是 EF 使用的默认值,因为 EF 不了解你的具体情况。

当你的Enitiy 修改了字段, EFCore 处理

当你的Enitiy 修改了字段,例如添加了一个新增Rating,在 DB 更新为包括新字段之前,应用将不会正常工作。 如果它现在运行,将引发以下 SqlException:

SqlException: Invalid column name ‘Rating’.

发生此错误是因为更新的 Movie 模型类与现有数据库的 Movie 表架构不同。 (数据库表中没有 Rating 列。)

可通过几种方法解决此错误:

  1. 让 Entity Framework 自动丢弃,并基于新的模型类架构重新创建数据库。
    在测试数据库上进行开发时,此方法在开发周期早期很方便;通过它可以一起快速改进模型和数据库架构。 但其缺点是会丢失数据库中的现有数据 -
    因此请勿对生产数据库使用此方法! 使用初始值设定项,以使用测试数据自动设定数据库种子,这通常是开发应用程序的有效方式。
    对于早期开发和使用 SQLite 的情况,这是一个不错的方法。
  2. 对现有数据库架构进行显式修改,使它与模型类相匹配。 此方法的优点是可以保留数据。 可以手动或通过创建数据库更改脚本进行此更改。
  3. 使用 Code First 迁移更新数据库架构。

code first的 处理方法:

Add-Migration Rating
Update-Database

总结

参考:官网地址

你可能感兴趣的:(.Net,.netcore)