ASP.NET Core学习笔记2

常见的数据库提供程序有以下几种:

数据库 配置示例 NuGet包

SQL Server 或 Azure SQL .UseSqlServer(connectionString) Microsoft.EntityFrameworkCore.SqlServer

Azure Cosmos DB .UseCosmos(connectionString, databaseName) Microsoft.EntityFrameworkCore.Cosmos

SQLite .UseSqlite(connectionString) Microsoft.EntityFrameworkCore.Sqlite

EF Core 内存中数据库 .UseInMemoryDatabase(databaseName) Microsoft.EntityFrameworkCore.InMemory

PostgreSQL .UseNpgsql(connectionString) Npgsql.EntityFrameworkCore.PostgreSQL

MySQL/MariaDB .UseMySql((connectionString) Pomelo.EntityFrameworkCore.MySql

Oracle .UseOracle(connectionString) Oracle.EntityFrameworkCore

DbContextOptionsBuilder其它常见配置项:

DbContextOptionsBuilder方法 作用 了解更多

UseQueryTrackingBehavior 设置查询的默认跟踪行为 查询跟踪行为

LogTo 获取EF Core 日志的一种简单方法(EF Core 5.0 及更高版本) 日志记录、事件和诊断

UseLoggerFactory 注册Microsoft.Extensions.Logging 工厂 日志记录、事件和诊断

EnableSensitiveDataLogging 在异常和日志记录中包括应用程序数据 日志记录、事件和诊断

EnableDetailedErrors 更详细的查询错误(以性能为代价) 日志记录、事件和诊断

ConfigureWarnings 忽略或引发警告和其他事件 日志记录、事件和诊断

AddInterceptors 注册EF Core 侦听器 日志记录、事件和诊断

UseLazyLoadingProxies 使用动态代理进行延迟加载 延迟加载

UseChangeTrackingProxies 使用动态代理进行更改跟踪 即将推出…

Conceptual Model (概念模型):ef会为实体类、数据库上下文类、默认约定、配置等创建概念模型

Storage Model (存储模型):可以理解为数据库结构。当使用code-first模式时,从概念模型推断。当使用database-first时,从目标数据库推断。

Mappings (映射):负责维护概念模型与存储模型之间的转换关系

2.2 查询和保存的处理过程

查询:EDM将linq翻译成sql,然后将数据库返回的数据翻译成实体对象

保存:EDM将改变的数据的翻译成sql

2.3 EF怎么知道SaveChanges时哪些内容要提交到数据库?

通过Change tracking实现的。当数据从数据库读取出来之后,EF会创建数据的快照,调用保存时会与快照进行对比。

EF是怎么工作的

EF的主要工作任务有:

  • 映射实体类的结构到对应的数据库结构上

  • 将LINQ查询翻译为sql并执行

  • 跟踪实体类数据的改变,当调用SaveChanges方法时把这些改变翻译成sql保存到数据库。

导航属性navigation properties:实体类Entity中包含的其他实体类属性,就是导航属性;也就是从一个数据库表导航到另一个数据库表,相当于外键;

游戏规则:

默认情况下,EF Core 将名字为ID或者ClassnameID的属性视为主键,所以这里的ID或者StudentID都可以为主键。Enrollments是导航属性,导航属性中包含与此实体相关的其它实体。Enrollments属性定义为ICollection<Enrollment>,也可以使用List<Enrollment>或HashSet<Enrollment>等集合类型。使用ICollection<Enrollment>时,EF Core会默认创建HashSet<Enrollment>集合。

StudentID是外键,对应的导航属性是Student。

如果一个属性的名称符合<导航属性名称><导航属性对应实体的主键属性名>,则EF会自动将其视为外键

另外如果属性名为<导航属性对应实体的主键属性名>也可以是外键。例如上面代码的CourseID,因为Course实体的主键就是叫CourseID。

System.InvalidOperationException: Property 'QuestionComment.Question' is not virtual. 'UseChangeTrackingProxies' requires all entity types to be public, unsealed, have virtual properties, and have a public or protected constructor. 'UseLazyLoadingProxies' requires only the navigation properties be virtual.

体系无效的操作异常:属性“问题注释”。问题“不是虚拟的”。‘使用更改跟踪代理”要求所有实体类型都是公共的、未密封的、具有虚拟属性,并具有公共的或受保护的构造函数。“使用激光加载代理”只需要导航属性是虚拟的。

/// <summary>

/// 问题评论

/// </summary>

public class QuestionComment : RootEntityTkey<long>

{

/// <summary>

/// 内容

/// </summary>

public string Content { get; set; }

/// <summary>

/// 创建时间

/// </summary>

public DateTime CreateTime { get; set; }

/// <summary>

/// 是否采纳

/// </summary>

public bool IsAdoption { get; set; }

/// <summary>

/// 创建用户ID

/// </summary>

public long CreateUserId { get; set; }

/// <summary>

/// 创建用户

/// </summary>

public virtual UserInfo CreateUser { get; set; }

/// <summary>

/// 问题ID

/// </summary>

public long QuestionId { get; set; }

/// <summary>

/// 问题

/// </summary>

public virtual Question Question { get; set; }

}

Fetch Error

结论:

  • Ambiguous HTTP method for action,翻译后是“不明确的HTTP操作方法”。

  • 有可能是没写HTTP方法,如 [HttpGet]、[HttpPost] ,在方法上添加上即可。

  • 也可能是将一些原本应该是私有的方法,写了public导致的。

导致错误的几种情况:

  • 部分方法或者参数没有放好注释。

  • 部分Public的方法没有设置好路由,仅在Controller级别设置了路由。将无需暴露的方法都设置为私有的。考虑在Controller级别设置[Route("api/[controller]/[action]")]

  • 生成的XML文件没有使用相对地址。注意:默认使用的是绝对地址,源码位置一有变化就会出问题。

  • XML文件需设置为“始终复制”

  • 接口

GMT

GMT时间,其实就是我们平常用的格林威治标准时间(又译:格林尼治标准时间Greenwich Mean Time)。

格林威治在哪里?格林威治指的是格林威治天文台,现位于伦敦的格林威治公园内。格林威治时间既指格林威治的地方时,也指格林威治所在时区的区时,全球共有24个时区,每一个时区都以格林威治的区时为基础进行加减。

AutoMapper

扁平化映射

扁平化映射(Flattening)

默认状况下,咱们的Source类和Destination类是根据属性名称进行匹配映射的。除此以外,默认的映射规则还有下面两种状况,咱们称之为扁平化映射,即当Source类中不包含Destination类中的属性的时候,AutoMapper会将Destination类中的属性进行分割,或匹配“Get”开头的方法;

验证配置项

验证配置项(Configuration Validation)

AutoMapper提供了一种验证机制,用来判断Destination类中的全部属性是否都被映射,若是存在未被映射的属性,则抛出异常。

举例

A→B:假如 TestA 有的字段 TestB 没有,则不复制;TestB 有的字段 TestA 中没有,则此字段不做处理(初始化值)。

在不配置的情况下,AutoMapper 默认会映射所有字段。

HomeController主要用于加载首页信息,让用户一打开站点就能看到,而不是登录之后才能看到;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值