ASP.NETCore2.0生态生态介绍--解析成SQL语句

xzdxmynet 发布于 2024-01-26 阅读(85)

前言

这是介绍.Net Core 2.0生态系统的最后一篇文章。 EF 一直是我最喜欢的 ORM 框架。 随着版本的升级,EF也发展到了EF6.x。 Core是一个全新的版本,支持跨平台,可以用三个词来概括EF Core的特点:轻量级、可扩展、跨平台。 跨平台特性是EF6.x不可替代的优势,也可能成为您项目中技术选择的原因之一。

获取并使用

在命令行工具中安装NuGet包,例如:安装SQL EF Core提供程序并指定版本为2.0.0。

$ dotnet add package Microsoft.EntityFrameworkCore.SqlServer -V 2.0.0

使用包管理器控制台安装

PM> Install-Package Microsoft.EntityFrameworkCore.SqlServer -Version 2.0.0

ASP.NET Core 2.0 中的默认项目包括支持 EF Core 2.0 的 SQL、数据库内提供程序。 创建项目时不需要额外添加。

查看在不同平台上使用 EF Core 的指南,查看更多安装和升级详细信息,并转到帮助文档。

新功能

以下是最显着的新功能:

解析成SQL语句

  SELECT [c].[Id], [c].[Name]  FROM [Customers] AS [c]  WHERE [c].[Name] LIKE N'a%';

使用通配符,如 SQL 中的 like 语句。

以下查询将仅返回尚未标记为删除的结果:

  var blog = context.Blogs
  .Include(b => b.Posts)
  .FirstOrDefault(b => b.Id == id);

这个特性在特殊的业务场景中会有很大的用处,比如多租户中的数据过滤实现。

将上面的代码转换成SQL语句,会创建一个名为@p0、值为 的参数,生成如下SQL语句:

    SELECT *    FROM Customers    WHERE City = @p0

项目升级和核心API变更

将项目.NET平台设置为支持.NET 2.0的平台

使用支持2.0的数据库提供程序

将 EF Core 参考包(包括运行时和工具)更新到 2.0

必要时修改代码,详细信息请参阅核心更改

2.0版本中,部分API和操作有较大改进,部分改进需要修改现有程序代码。 对于大多数应用程序来说,影响并不显着。 在大多数情况下,只需要重新编译和最少的修改。 替换过时的 API。

获取应用服务的新方式

注意:EF Core 的设计时操作(例如生成数据迁移代码和更新数据库)需要访问应用程序服务。 设计时工具和应用程序之间存在调用关系。

建议将 ASP.NET Core Web 应用程序更新到 2.0,并在 ASP.NET Core 2.0 中的启动类之外初始化配置。 在以前版本的 EF Core 中,EF Core 尝试直接访问应用程序的服务提供者。 使用 EF Core 的应用程序通常从配置文件访问连接字符串,因此仅需要获取连接字符串已经不够了。

将 ASP.NET Core 1.x 更新到 2.0 时,使用 EF Core 工具时,您将收到以下错误消息:

'' 上没有找到。 在 '' 中添加 a 或在与 '' 相同的情况下添加 ''

在 ASP.NET Core 2.0 默认模板、静态方法中添加了设计时支持。 允许 EF Core 在设计时访问应用程序服务提供者,如果升级 ASP.NET Core 1.x 应用程序,请同时升级

using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;

namespace AspNetCoreDotNetCore2._0App{  
 public class Program    {        public static void Main(string[] args)        {            BuildWebHost(args).Run();        }        public static IWebHost BuildWebHost(string[] args) =>            WebHost.CreateDefaultBuilder(args)                .UseStartup()                .Build();    } }

注意:如果没有 ASP.NET Core 2.0 应用程序且启动模式没有更改,您仍然可以使用实现接口方法来提供 EF Core 2.0 设计时支持,但不建议这样做。

更换名字

为了支持不同的应用模式,并在设计时提供更多的定制化控制,之前的版本中都提供了该接口。 在设计时,EF Core 工具将发现应用程序中接口的实现并使用它来创建对象。

由于这个接口有一个通用的名称,很容易误导开发者用它来处理需要重新创建的开发场景。 EF Core 工具在设计时使用时,没有考虑到设计时的特殊环境,可能会导致 - 或 ef 命令执行失败。 。

基于以上原因,为了更准确地表达这个接口的作用,我们对其进行了重命名。 它在 2.0 中仍然存在,但已被标记为已过时。

删除

由于升级到ASP.NET 2.0,我们发现界面中不再需要ons了。

以下是您应该使用的替代方案。

EF Core 2.0 需要 2.0 数据库提供程序

对于 EF Core 2.0,我们对数据库提供者的工作进行了许多简化和改进。 1.0.x 和 1.1.x 提供程序不再在 EF Core 2.0 下工作。

SQL 和数据库提供程序由 EF 团队开发,将在 2.0 版本中提供。 其他数据库提供商也已升级至2.0版本:

记录和诊断事件更改

注意:这些更改不会影响大多数应用程序代码。

发送到的消息的事件 ID 在 2.0 中发生了更改。 事件 ID 现在在 EF Core 中是全局唯一的。 这些消息现在还遵循结构化日志记录的标准模式,例如 MVC。

类别也发生了变化,可以通过以下方式访问类别。

事件现在使用与相应消息相同的时间ID名称,并且事件ID、负载类型和类别是统一的。

ID 从 .. 命名空间移至 ..

EF Core 元数据关系 API 更改

EF Core 2.0 为不同的提供者创建了不同的提供者,通常对应用程序是透明的,从而简化了底层元数据 API,使得任何元数据到公共关系都可以通过调用来实现,对比下面的代码,在 1.1.x 中的代码:

var tableName = context.Model.FindEntityType(typeof(User)).SqlServer().TableName;

现在你可以这样写

var tableName = context.Model.FindEntityType(typeof(User)).Relational().TableName;

更加通用。

例如,现在可以使用更通用的代码来实现 using 方法

modelBuilder.Entity<User>().ToTable(Database.IsSqlServer() ? "SqlServerName" : "OtherName");

请注意,此更改仅适用于为所有关系提供者定义的 API/元数据。 当仅针对单个提供商时,API 和元数据仍然相同。 例如,聚集索引是特定于 SQL 的,因此必须使用红色和 .().()。

不控制 EF 服务提供商

EF Core 使用框架内置的实现,应用程序应允许 EF Core 创建和管理此提供程序。 强烈建议删除所有不需要通过应用程序代码调用的调用。 建议去除。 使用方法与之前相同。

内存数据库必须命名

全局匿名内存数据库已被删除,所有内存数据库都必须命名。

optionsBuilder.UseInMemoryDatabase("MyDatabase");

即使名称相同并被多次调用,仍然使用相同的数据库,从而允许它被多个上下文实例共享。

只读 API 更改

,, 和 ys 已过时并被 和 取代。 这些行为适用于任何属性(不仅仅是存储生成的属性),并检测属性值的使用方式,例如插入数据库行 () 或更新现有数据库行 ()。

属性用 . 标记,例如:计算列。 默认情况下,当前为此属性设置的任何值都将被忽略。 这意味着无论是否在跟踪实体上设置或修改任何值,您将始终获得存储生成的值。 这可以通过设置不同的 \.

新的删除行为

在之前的版本中,存在通过上下文来跟踪实体的行为,这与语义更加封闭。 EF Core 2.0 中有一个新行为作为可选关系的默认值。 此行为设置用于跟踪实体的语义并限制使用 EF Core 创建的数据库的行为。 根据我们的经验,这对于跟踪实体和数据库非常有用。

设计时提供者变更

...参考包已删除,功能合并到 .. 和 ..参考包中。

不同的数据设计时参考包,例如...,...,已集成到其主要提供程序中。

在 EF Core 2.0 中启用 - 或者 EF 现在只需要引用单个包

Include="Microsoft.EntityFrameworkCore.SqlServer"
    Version="2.0.0" />
Include="Microsoft.EntityFrameworkCore.Tools"
    Version="2.0.0"
    PrivateAssets="All" />
Include="Microsoft.EntityFrameworkCore.Tools.DotNet"
    Version="2.0.0" />

下一步

我们已经在开发下一个版本,检查开发计划,并且也正在完成 EF 6.2。

遗憾的地方

相关文章:

标签:  应用 程序 更改 语句 引用 

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。