七、使用 Micro ORMs、NoSQL 和 Azure 访问数据

在本章中,我们将学习以下食谱:

  • 使用 Dapper 访问数据
  • 使用 OrmLite 访问数据
  • 使用 MongoDb 访问数据
  • 使用 Azure 存储表访问数据
  • 使用存储 blob 访问数据
  • 使用 SQL Azure 访问数据

介绍

在本章中,我们将学习如何在 ASP 中以不同于实体框架的其他方式访问数据.NET 的核心。 我们将使用微 orm,如 Dapper 和 OrmLite(但我们也可以使用 Massive, SimpleData,或 PetaPoco); 与 NoSQL 数据库,如 MongoDB 和 ElasticSearch(但我们也可以使用 Redis, RavenDB, DocumentDB,和许多其他); 以及 Azure 的数据库功能。

微型 orm

微型 ORM 是一种轻量级的、高性能的 ORM。

这并不意味着其他 orm,如 Entity Framework、NHibernate 等,不能被执行,但它确实意味着它们需要一些配置(没有实体跟踪,使用存储过程)。 它们更快,而且功能更少,因为它们不想覆盖所有可能的场景。

这些 Micro orm 通常允许我们将 SQL 请求的结果直接映射到 CLR 对象,就像AutoMappers所做的那样。 但是,它们不会跟踪实体的状态,不会在数据库的内存中有对象关系表示,也不会允许我们通过可视化设计器以图形方式管理对象关系映射。

使用 Micro ORM 使得创建领域模型和对我们的应用使用领域驱动开发变得更加困难,但是这是一个哲学和/或架构方面的讨论,我们在本书中不会涉及。

NoSQL

NoSQL 数据库现在非常流行。 面向文档或面向图,它们允许我们以键-值对的形式存储数据并非常快速地检索它。

使用 Dapper 访问数据

在本教程中,我们将学习如何使用 ASP 中的 Dapper Micro ORM 从数据库中获取数据.NET 的核心。

准备

Dapper 由 SamSaffron 创建,可以在他的 GitHub 知识库中找到:https://github.com/SamSaffron/dapper-dot-net

让我们用 Visual Studio 2017 创建一个新的空 web 应用。

怎么做……

我们将在 SQL Express 数据库中查询 Book 表:

  1. 首先,我们将创建三个文件夹:ControllersModelsViews
  2. 接下来,我们将以下 NuGet 包添加到项目的依赖项中:
"Microsoft.AspNetCore.Server.IISIntegration",
"Microsoft.AspNetCore.Server.Kestrel",
"Microsoft.AspNetCore.Mvc",
"Microsoft.AspNetCore.Razor.Tools",
"Microsoft.Extensions.Configuration.EnvironmentVariables",
"Microsoft.Extensions.Configuration.Json",
"System.Data.Common",
"System.Data.SqlClient",
"Dapper"
  1. 接下来,让我们创建一个appsettings.config文件来添加我们的数据库连接字符串,并添加以下代码:
{
  "ConnectionStrings": {
    "CookBookConnection": 
  "Data Source=PC-HOME\\SQLEXPRESS;Initial Catalog=CookBook;Integrated Security=True;MultipleActiveResultSets=true;"
  }
}
  1. 接下来,我们将在Startup.csConfigureServices方法中配置依赖注入,将IDbConnection注入到我们将要创建的控制器中:
services.AddScoped<IDbConnection>
(connection => new SqlConnection(
Configuration.GetConnectionString(
"CookBookConnection")));

Startup.cs班如下:

using System.Data;
using System.Data.SqlClient;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Configuration;

public class Startup
{
  public Startup(IHostingEnvironment env)
  {
    // Set up configuration sources.
    var builder = new ConfigurationBuilder()
    .SetBasePath(env.ContentRootPath)
    .AddJsonFile("appsettings.json", 
  optional: true, reloadOnChange: true);

    builder.AddEnvironmentVariables();
    Configuration = builder.Build();
  }
  public IConfigurationRoot Configuration { get; set; }
  // This method gets called by the runtime. Use this method to add services to the container.
  // For more information on how to configure your application, visit http://go.microsoft.com/fwlink/?LinkID=398940
  public void ConfigureServices(IServiceCollection services)
  {
    services.AddScoped<IDbConnection>
    (connection => new SqlConnection(
  Configuration.GetConnectionString(
  "CookBookConnection")));

    services.AddMvc();
  }

  // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
  public void Configure(IApplicationBuilder app)
  {
    app.UseMvc(routes =>
    {
      routes.MapRoute(
      name: "default",
      template: "{controller=Home}/{action=Index}/{id?}");
    });
  }
}

我们可以看到,路由被配置为使用Book控制器直接启动应用。

  1. 接下来,我们在Model文件夹中创建一个名为Book的类。 这个类对应于 SQL Server Express 数据库中的Book表:
public class Book 
{ 
  public int Id { get; set; } 
   public string Name { get; set; } 
}
  1. 接下来,我们创建一个名为BookController的控制器:
public class BookController : Controller 
{ 
  private readonly IDbConnection _db; 
  public BookController(IDbConnection db) 
  { 
     _db = db; 
  } 

  public IActionResult Index() 
  { 
    List<Book> books = _db.Query<Book>("GetAllCookbooks",                                        
    commandType: CommandType.StoredProcedure)
    .ToList(); 
    return View(books); 
  } 
}

如我们所见,我们已经将IDbConnection注入到BookController构造器中。

  1. Views文件夹中,我们将添加一个Book和一个Shared文件夹。

  2. Views文件夹中,我们还将添加一个ViewStart文件:

  1. Shared文件夹中,我们添加一个Layout文件:

  1. Book文件夹中,我们添加Book控制器中Index动作方法对应的index.cshtml文件:

该文件包含以下代码:

@model List<Ch07.Book> 
<h2>Books</h2> 
<ul> 
  @foreach(var book in Model) 
  { 
    <li>@book.Name</li> 
  } 
</ul>

最后,我们可以看到应用通过按F5或启动应用按钮工作:

有更多的…

Mark Seemann 关于依赖注入的书http://amzn.to/12p90MG非常有趣。

我们也可以阅读 Mark Seemann 的博客http://blog.ploeh.dk/

使用 OrmLite 访问数据

在本教程中,我们将学习如何使用 ASP 从 OrmLite Micro ORM 数据库中获取数据.NET 的核心。

准备

代码几乎与前面的配方相同; 只有一些变化。

怎么做……

  1. 首先,我们将创建三个文件夹:ControllersModelsViews
  2. 接下来,我们将以下 NuGet 包添加到项目中的依赖项中:
"Microsoft.AspNetCore.Server.IISIntegration", 
"Microsoft.AspNetCore.Server.Kestrel", 
"Microsoft.AspNetCore.Mvc", 
"Microsoft.AspNetCore.Razor.Tools", 
"Microsoft.Extensions.Configuration.EnvironmentVariables","Microsoft.Extensions.Configuration.Json", 
"System.Data.Common", 
"System.Data.SqlClient", 
"ServiceStack.OrmLite.SqlServer" 
  1. 接下来,让我们创建一个appsettings.config文件来添加我们的数据库连接字符串,并添加以下代码:
{ 
  "ConnectionStrings": 
  { 
    "CookBookConnection":  
    "Data Source=PC-HOME\SQLEXPRESS;Initial 
    Catalog=CookBook;Integrated 
    Security=True;MultipleActiveResultSets=true;" 
  } 
} 
  1. 接下来,我们将在Startup.csConfigureServices方法中配置依赖注入,将IDbConnection注入到我们将要创建的控制器中:
services.AddScoped<IDbConnection> 
(connectionFactory => new OrmLiteConnectionFactory( 
Configuration.GetConnectionString("CookBookConnection"),  
SqlServer2012Dialect.Provider).OpenDbConnection());  

Startup.cs班如下:

using Microsoft.AspNetCore.Builder; 
using Microsoft.AspNetCore.Hosting; 
using Microsoft.Extensions.DependencyInjection; 
using Microsoft.Extensions.Configuration; 
using System.Data; 
using ServiceStack.OrmLite; 

public class Startup 
{ 
  public Startup(IHostingEnvironment env) 
  { 
    // Set up configuration sources. 
    var builder = new ConfigurationBuilder() 
    .SetBasePath(env.ContentRootPath) 
    .AddJsonFile("appsettings.json", optional: true,                          
    reloadOnChange: true); 
    builder.AddEnvironmentVariables(); 
    Configuration = builder.Build(); 
  } 
  public IConfigurationRoot Configuration { get; set; } 
  // This method gets called by the runtime. Use this 
  method to add services to the container. 
  // For more information on how to configure your 
  application, visit http://go.microsoft.com/fwlink/?
  LinkID=398940 
  public void ConfigureServices(IServiceCollection 
  services) 
  { 
    services.AddScoped<IDbConnection> 
    (connectionFactory => new OrmLiteConnectionFactory( 
    Configuration.GetConnectionString
    ("CookBookConnection"), SqlServer2012Dialect.Provider)                        
    .OpenDbConnection()); 
    services.AddMvc(); 
  } 

  // This method gets called by the runtime. Use this 
  method to configure the HTTP request pipeline. 
  public void Configure(IApplicationBuilder app) 
  { 
    app.UseMvc(routes => 
    { 
      routes.MapRoute( 
      name: "default", 
      template: "{controller=Home}/{action=Index}/{id?}"); 
    }); 
  } 
}

我们可以看到,路由被配置为使用Book控制器直接启动应用。

  1. 接下来,我们在Model文件夹中创建一个名为Book的类。 这个类对应于 SQL Server Express 数据库中的Book表:
public class Book 
{ 
  public int Id { get; set; } 
  public string Name { get; set; } 
}
  1. 接下来,我们创建一个名为BookController的控制器:
using System.Collections.Generic; 
using Ch07R2.NetFrmk.Models; 
using Microsoft.AspNetCore.Mvc; 
using System.Data; 
using ServiceStack.OrmLite; 

public class HomeController : Controller 
{ 
  private IDbConnection _db; 
  public HomeController(IDbConnection db) 
  { 
    _db = db; 
  } 
  public IActionResult Index() 
  { 
    List<Book> books = new List<Book>(); 
    books = _db.SqlList<Book>("GetBooks"); 
    return View(books); 
  } 
}  

正如我们所看到的,我们已经在BookController构造函数中注入了OrmLiteConnectionFactory

  1. Views文件夹中,我们将添加BookShared文件夹。
  2. Views文件夹中,我们还将添加一个ViewStart文件:

  1. Shared文件夹中,我们添加一个Layout文件:

  1. Book文件夹中,我们添加了Book控制器中索引操作方法对应的index.cshtml文件:

该文件包含以下代码:

@model List<Ch07.Book> 
<h2>Books</h2> 
<ul> 
  @foreach(var book in Model) 
  { 
    <li>@book.Name</li> 
  } 
</ul>

最后,我们可以看到应用通过按F5或启动应用按钮工作:

使用 MongoDb 访问数据

在本菜谱中,我们使用 MongoDB(一个 NoSQL 数据库)访问数据。

准备

我们将使用 VS 2017 和 ASP.NET 的核心。

为了访问数据,我们将首先在本地安装 MongoDB。 之后,我们将安装一个名为 AdminMongo 的 Node.js 模块,为我们提供一个通过图形界面查看和管理 mongo 数据的接口,然后,在创建一些数据后,我们将在一个 ASP. js 中使用它.NET Core 应用。

怎么做……

  1. 首先,我们从官方网站https://www.mongodb.com/download-center#community下载 MongoDB 社区版本,双击.msi文件:

  1. 让我们指定一个安装目录,并选择自定义安装选项:

  1. 接下来,我们创建将存储数据的目录。 默认情况下,我们必须在安装时选择的MongoDB目录中创建/data/db文件夹。 我们还必须在MongoDB目录中创建/log/mongo-server.log
  2. 之后,我们将创建 MongoDB 配置文件。 让我们在MongoDB目录root中创建mongod.cfg。 该文件将包含以下数据:
bind_ip = 127.0.0.1
dbpath = C:mongodbdatadb 
logpath = C:mongodblogmongo-server.log
verbose=v
  1. 现在 MongoDB 安装在我们的计算机上。 让我们告诉 MongoDB 使用这个文件作为配置文件:
C:\mongodb\bin\mongod.exe -config C:\mongodb\
mongod.cfg -install

  1. 让我们启动 MongoDB Windows 服务通过在命令提示符中输入以下命令与管理员权限:
net start MongoDB 

The default port for Mongo is 27001

我们可以看到 MongoDB 服务在services.msc启动:

  1. 现在我们将安装开源免费工具 AdminMongo 来管理 MongoDB 数据。 要做到这一点,让我们通过命令提示符进入 Node.js 模块目录,输入以下命令:
cd C:\Program Files (x86)\nodejs\node_modules\npm\node_modules
  1. 接下来,让我们将AdminMongoGitHub 存储库克隆到我们的本地机器上,输入以下命令:
git clone https://github.com/mrvautin/adminMongo.git 
&& cd adminMongo

  1. 接下来,我们安装依赖项:
npm install 

  1. 现在我们可以通过输入以下命令来启动应用:
npm start 
  1. 最后,我们推出http://127.0.0.1:1234:

  1. 让我们通过在 create new database 中插入以下名称并单击 create 来创建Cookbook数据库:

Cookbook数据库现在出现在数据库对象菜单中。

  1. 现在已经创建了Cookbook数据库,让我们添加一个名为Book的集合,通过选择左边的数据库名称来请求数据:

A collection in MongoDB is the equivalent of a table, and a document is the equivalent of a row in a SGBDR.

The document in MongoDB is a BSON object.

  1. 我们通过单击 New document 将 JSON 对象 Book 添加为文档。 将出现以下画面:

  1. 让我们创建一个新文档,并选择 Add document:

  1. 我们将创建另一个文档,并观察在Book表左侧的结果选择:

创建的两个 BSON 对象如下:

{ 
  "_id": "575eaac5f8e681b00fc607f7", 
  "Id": 1, 
  "Name": "Data Access: Entity Framework" 
} 
{ 
  "_id": "575eab2af8e681b00fc607f8", 
  "Id": 2, 
  "Name": "Data Access : Azure" 
} 

_id由 MongoDB 生成。

现在在我们的Book表中有两个文档; 让我们创建一个 web 页面来显示这些数据。

  1. 让我们打开 Visual Studio 并创建一个新的空 ASP.NET Core 应用(.NET 框架):

  1. 我们将为我们的 web 应用创建文件夹结构。 为此,我们在应用的根目录中添加以下目录:ControllersDataModelsViews:

  1. 接下来,我们手动将以下库添加到项目中的依赖项中:
"Microsoft.AspNetCore.Server.IISIntegration", 
"Microsoft.AspNetCore.Server.Kestrel", 
"Microsoft.AspNetCore.Mvc", 
"Microsoft.AspNetCore.Razor.Tools" 
"mongocsharpdriver": "2.2.4", 
"MongoDB.Bson": "2.2.4", 
"MongoDB.Driver": "2.2.4", 
"MongoDB.Driver.Core": "2.2.4" 

相应的 NuGet 包会自动下载。

  1. 现在,我们在Models文件夹中创建一个模型,对应MongoDB数据库中的Book表结构:
using MongoDB.Bson; 
using MongoDB.Bson.Serialization.Attributes; 
public class Book 
{ 
  [BsonRepresentation(BsonType.ObjectId)] 
  public string Id { get; set; } 
  public string Name { get; set; } 
} 
  1. 接下来,由于Data文件夹中的MongoDB.Driver库,我们创建CookbookContext类来与 MongoDB 通信。

让我们添加以下代码:

using MongoDB.Driver;
public class CookbookContext
{
  private readonly string connectionString = "mongodb://localhost";
  private readonly string databaseName = "CookBook";
  public IMongoDatabase Database;
  public CookbookContext()
  {
    var settings = MongoClientSettings.FromUrl(
    new MongoUrl(connectionString));
    var client = new MongoClient(settings);
    Database = client.GetDatabase(databaseName);
  }
  public IMongoCollection<Book> Books => Database.GetCollection<Book>("Book");
}
  1. 接下来,我们在Models文件夹中创建一个ViewModel类:
public class BookViewModel 
{ 
  public string Id { get; set; } 
  public string Name { get; set; } 
} 
  1. 然后,我们在Controllers文件夹中创建一个控制器:
using Microsoft.AspNetCore.Mvc; 
using System.Threading.Tasks; 
using MongoDB.Driver; 
using MongoDB.Driver.Linq; 

public class HomeController : Controller 
{ 
  private readonly CookbookContext _context; 

  public HomeController(CookbookContext context) 
  { 
    _context = context; 
  } 
  public async Task<ActionResult> Index() 
  { 
    var books = await _context.Books.AsQueryable() 
    .Select(b => new BookViewModel 
    { 
      Id = b.Id, 
      Name = b.Name 
    }) 
    .OrderByDescending(b => b.Id) 
    .ToListAsync(); 
    return View(books); 
  } 
} 
  1. 让我们将以下代码添加到Startup.cs文件中:
public class Startup 
{ 
  public void ConfigureServices(IServiceCollection 
  services) 
  { 
     services.AddScoped(repository => new 
     CookbookContext()); 
     services.AddMvc(); 
  } 

  public void Configure(IApplicationBuilder app) 
  { 
    app.UseMvc(routes => 
    { 
      routes.MapRoute(
      name: "default",
      template: "{controller=Home}/{action=Index}/{id?}"); 
    }); 
  } 
} 
  1. 接下来,我们在前面创建的Views文件夹中的Home文件夹中创建一个View文件:
@model List<Ch07R3.NetFrmk.Models.BookViewModel> 
<h2>Books</h2> 
<ul> 
    @foreach (var b in Model) 
    { 
        <li>@b.Name</li> 
    }
 </ul>
  1. 让我们看看在浏览器中启动应用的结果:

它是如何工作的…

在 MongoDB 中,我们使用的是 NoSQL 文档数据库。 MongoDB 将 JSON 对象存储为二进制 JSON(一个文档),每个文档(每个 JSON 对象)是表中的一行。

JSON (JavaScript 对象表示法)只是一个 JavaScript 文字对象,用作数据交换格式。 它可以这样表示:{},一对括号,其中包含键值对。

MongoDB 使用 BSON 格式,即二进制 JSON 来存储、接收和发送 JSON 数据。 Mongo 使用 BSON 扩展 JSON 以提供额外的数据类型,并在不同语言之间更有效地进行编码和解码。

我们可以使用 MongoDB,但我们也可以将它作为所有云提供商的云服务,当然,也可以在 Azure 平台中使用。

有更多的…

要了解 MongoDB 文档和白皮书,去:

JSON 文档,去:

对于 BSON 文档,请访问:

使用 Windows Azure 存储表访问数据

在本菜谱中,我们将使用 Windows Azure Table 存储从 Azure 中的 NoSQL 数据库检索数据。

准备

要与 Azure 存储通信,我们必须:

  • 为。net 安装 Azure SDK
  • 创建一个 Azure Storage 帐户
  • 安装两个 NuGet 包:WindowsAzure.ConfigurationManagerWindowsAzure.Storage

在这之后,我们将能够使用 Azure 存储中的所有服务:blobs、文件、队列和表。

怎么做……

正如在前面的配方(数据访问与 MongoDb),我们将直接进入编码:

  1. 首先,我们打开 Visual Studio 中的服务器资源管理器来查询我们的 Azure 订阅中可用的 Azure 服务:

  1. 接下来,让我们安装 Azure SDK。net:

  1. 保存并运行此文件:

这将打开微软平台安装程序并下载 Azure SDK。net:

下面是 Azure SDK 中所有已安装的库和组件:

我们可以在 Azure 菜单中看到更多的项目。

  1. 现在,我们将使用 Azure 订阅来创建一个 Azure 存储帐户。
  2. 连接到我们的 Azure 帐户后,我们点击新按钮|数据+存储|存储帐户:

  1. 要创建一个存储帐户,我们必须添加一个名称、一个订阅和一个资源组:

  1. 点击 Create 按钮后,存储帐户现在可用,我们可以使用 blob、文件、表和队列存储服务:

  1. 我们将复制存储密钥在应用中使用,作为设置|帐户密钥|密钥 1 中的凭证:

  1. 现在让我们回到 Visual Studio 云资源管理器,并创建一些数据来检索:

  1. 右键单击 Tables,选择 Create Table:

  1. 现在创建了Book表,让我们创建一些行:

  1. 让我们打开Book表的表编辑器,并单击 Add Entity 按钮。 将打开以下对话框:

  1. 我们添加第一行:

The primary key in a storage table is the concatenation of the partition key and the row key. The Timestamp field is automatically created by the system to manage concurrency of updates.

  1. 我们添加第二行:

  1. 要调用 Azure 存储服务,我们必须向项目中添加以下库:
"Microsoft.AspNetCore.Server.IISIntegration", 
"Microsoft.AspNetCore.Server.Kestrel", 
"Microsoft.AspNetCore.Mvc", 
"Microsoft.AspNetCore.Razor.Tools" 
"Microsoft.WindowsAzure.ConfigurationManager", 
"WindowsAzure.Storage" 
  1. 现在我们有了要从 Azure 存储中检索的数据,让我们创建一个空的 ASP.NET Core 应用与。NET 框架。 我们在文件夹中创建我们需要的结构:ModelsRepositoryControllersViews

Models目录中,我们将创建BookViewModel类。 这个类将被映射到 Azure 存储表中存储的实体:

public class BookViewModel 
{ 
  public string Id { get; set; } 
   public string Name { get; set; } 
} 
  1. 接下来,我们创建一个存储库来检索 Azure Tables:
public class AzureStorageRepository 
{ 
  private const string _name = "sbzstorage"; 
  private const string _key = 
  "lFlEbSvI7CppXalu8Z/89yFuvFLGYWzm5PJcH3Lzx5FvIO7esTagtRB
  dZ5m1Xv..."; 

  private readonly CloudStorageAccount _account; 

  public AzureStorageRepository() 
  { 
    StorageCredentials creds = 
    new StorageCredentials(_name, _key); 

    _account = new CloudStorageAccount(creds, false); 
  } 

  public List<DynamicTableEntity> 
  GetBooksFromAzureStorage() 
  { 
    // Create a table client.
    CloudTableClient tableClient =   
    _account.CreateCloudTableClient(); 

    // Get a reference to the Book table 
    // in Azure Storage Table 
    CloudTable bookStorageTable = 
    tableClient.GetTableReference("Book"); 

    // Create a query for all entities. 
    List<DynamicTableEntity> query =  
    bookStorageTable
    .CreateQuery<DynamicTableEntity>()
    .ToList(); 
    return query; 
  } 
} 
  1. 接下来,让我们创建一个Controller:
public class HomeController : Controller 
{ 
  private readonly AzureStorageRepository _repository; 
  public HomeController(AzureStorageRepository repository) 
  { 
    _repository = repository; 
  } 
  public ActionResult Index() 
  { 
    var books = _repository.GetBooksFromAzureStorage() 
    .AsQueryable() 
    .Select( 
    b => new BookViewModel 
    { 
      Id = b.PartitionKey, 
      Name = b.RowKey 
    }) 
    .OrderByDescending(b => b.Id) 
    .ToList(); 
    return View(books); 
  } 
} 
  1. 我们还必须修改Startup.cs,添加必要的中间件,并管理存储库的生命周期:
public class Startup 
{ 
  public void ConfigureServices(IServiceCollection 
  services) 
  {
    services.AddScoped(repository => 
    new AzureStorageRepository());
    services.AddMvc(); 
  } 

  public void Configure(IApplicationBuilder app) 
  { 
    app.UseMvc(routes => 
    { 
      routes.MapRoute( 
      name: "default", 
      template: "{controller=Home}/{action=Index}/{id?}"); 
    }); 
  } 
} 
  1. 最后,我们创建一个视图来显示 Azure 存储请求的结果:
@model List<Ch07R4.NetFrmk.Models.BookViewModel> 

<h2>Books</h2> 
<ul> 
    @foreach (var b in Model) 
    { 
        <li>@b.Name</li> 
    }
</ul>
  1. 我们可以看到 Azure 表中的实体显示在浏览器中:

它是如何工作的…

Azure 表存储允许我们的应用持久地存储无模式数据。 Azure 表存储在表中包含表和行。 我们可以将一个类的实例存储在 Azure 表存储中,如果这个类继承自TableEntity类。

TableEntity类与 Azure 表存储。net 库一起提供; 我们只是创建一个继承自TableEntity的类,实例化它,并使用 Azure 表存储。net 库将该实例存储在云中。

Azure 表存储具有巨大的编程语言支持,如。net、Java、PHP、c++、Node.js、Python、Ruby 等。

使用 Azure 存储 blob 访问数据

在这个配方中,我们将显示存储在 Blob 中的图片,这要归功于之前在上一个配方中创建的存储帐户。

准备

我们将在 Azure 订阅中使用 VS 2017 和一个存储帐户。

怎么做……

  1. 首先,让我们连接到我们的 Azure 门户:

  1. 接下来,我们选择在上一个配方中创建的 Azure 存储,并选择 Blob 服务:

  1. 接下来,我们点击加号容器按钮,新的容器面板就会出现。 我们给容器添加一个名称和一个访问类型(Blob 或 container):

  1. 现在让我们打开 Visual Studio,创建一个空的 ASP。 .NET Core application with .NET Framework,并添加以下目录:ControllersImagesModelsRepository,和Views

我们还将Home目录添加到Views目录,并从刚刚创建的 Blob 存储中上传和下载一张图片:

  1. 接下来,我们在project.json文件Microsoft.Azure.ConfigurationManagerWindowsAzure.Storage中手动添加两个 NuGet 包,以使用 Azure 存储 api:

  1. 接下来,我们将ImageViewModel类添加到Models文件夹:

  1. 现在我们在Repository文件夹中创建IAzureStorageRepository界面:

  1. 接下来,我们创建了AzureStorageRepository类,它继承自IAzureStorageRepository来与 Azure 存储 api 通信:

  1. 我们从 Azure 门户的 Azure 存储面板中检索关键帐户:

  1. 接下来,添加CloudStorageAccountStorageCredentials类进行身份验证:

  1. 右键单击类,CodeLens要求我们解析CloudStorageAccount:

  1. 同样的事情发生在StorageCredentials类上:

  1. 让我们添加以下代码来上传Budapest.jpgImages文件夹中,并检索现在存储在 Microsoft Cloud 中的此图片的 URL:

  1. 接下来,我们创建一个控制器来从AzureStorageRepository中获取 URL 图像:

  1. 让我们修改Startup.cs文件来配置注入到控制器构造器中的存储库,将 MVC 中间件添加到 HTTP 管道中,并配置 MVC 路由:

  1. 接下来,我们在Views/Home文件夹中添加一个视图来显示 Azure 中 Blob 容器中的Budapest.jpg:

  1. 让我们启动 web 应用:

  1. 最后,我们检查存储在 imagescontainer Blob 中的上传和显示的图片:

使用 SQL Azure 访问数据

在本菜谱中,我们将从 Azure 上的 SQL Server 访问数据。 我们谈论的是 Azure 上的 SQL Server 服务,而不是虚拟机。

准备

我们将连接到我们的 Azure 订阅来订阅 SQL Azure 数据库。

在创建一个 SQL Server 之后,我们将在这个 SQL Server 上创建一个数据库。 我们将在 Visual Studio 2017 中创建一个表并向其添加数据。 最后,我们将创建一个网页,使用我们新创建的 Azure 数据库中的数据,这是我们使用 SQL 创建的。

要做到这一点,我们需要安装了 SQL 数据工具的 Visual Studio 2017 和 Azure 订阅。

怎么做……

  1. 首先,我们将连接到我们的 Azure 订阅。
  2. 接下来,我们将创建一个名为dbcookbook的 SQL Server:

  1. 我们选择浏览| SQL 服务器:

  1. 单击 Add,然后填充 SQL Server 表单,给出服务器名、管理员登录名、密码、订阅、资源组和位置。
  2. 要创建服务器,我们点击底部的 create 按钮:

单击 Refresh 按钮,我们可以看到新创建的 SQL Server。

  1. 接下来,我们在 SQL Serverdbcookbook上创建一个名为CookbookCh07的 Azure SQL 数据库:

我们可以单击 Browse 或直接单击 SQL 数据库,如果我们在左边的主菜单中有它。 SQL 数据库面板将打开,在单击 Add 按钮之后,我们将必须填写 SQL 数据库表单。

  1. 我们填写数据库名称、订阅、资源组、源(空白、示例或备份)、服务器(我们将添加之前创建的 SQL server)、定价层(它将决定数据库的价格和功能)和排序:

通过单击定价层,我们可以看到数据库的所有可用价格和配置选项。

  1. 我们点击刷新按钮来查看新创建的CookbookCh07SQL Server 数据库:

  1. 现在我们选择CookbookCh07SQL Server 数据库,点击工具按钮:

  1. 接下来,我们选择 Open in Visual Studio 按钮,通过 VS 2017 SQL Data Tools 用 Visual Studio 2017 打开数据库:

我们可以看到,在打开 VS 2017 之前,我们可以配置防火墙规则和/或下载 SQL Server 数据工具(如果没有安装的话)。

  1. 下面的对话框要求使用 Visual Studio 创建远程连接:

我们授权此连接:

Visual Studio 启动。

  1. 下面的对话框询问我们数据库信息连接:

在填写正确的信息后,我们点击连接按钮。

  1. 如果在 Azure 门户上没有为我们的计算机创建防火墙规则,则会打开下面的对话框:

我们可以添加一个授权的 IP 地址或 IP 地址范围:

我们可以通过 SQL 数据库选项在 Azure 门户中设置防火墙规则。

  1. 我们可以看到 Visual Studio 打开,SQL Server 和 SQL Server 对象管理器中创建的数据库:

  1. 接下来,我们通过右键单击Tables文件夹创建一个Book表:

  1. 我们选择添加新表… 在上下文菜单中:

  1. 接下来,我们在 T-SQL 面板中修改 SQL 脚本,添加红色框的代码:

  1. 在第一个框中,我们添加 T-SQL 代码以使主键自动增加,在第二个框中,我们将 varchar Name 字段添加到Book表中。 我们还使用 Book 修改表名。 要应用这些修改,我们点击更新按钮:

出现对话框并询问我们是要生成 SQL 脚本、更新数据库还是取消。 我们点击更新数据库按钮。

我们可以在 Data Tools Operations 面板中看到任务是否被正确执行。

  1. 接下来,让我们向刚刚创建的Book表添加数据:

为此,我们右键单击Book表:

现在让我们在Book表中添加三个项目。

  1. 接下来,我们将创建一个 web 应用来显示来自 Azure SQL 数据库的数据:

我们创建一个 ASP.NET Core 应用运行。NET 框架。

我们选择一个空的 web 应用。

下面是解决方案资源管理器中的空模板。

  1. 我们在应用中添加以下文件夹:ControllersDataModelsViewsHome在视图内:

  1. 现在我们在Models目录下创建一个Book类,对应于 SQL Azure 数据库中的Book表:

  1. 接下来,我们创建CookBookContext类来管理数据。 让我们将以下代码添加到这个类:

  1. 接下来,我们通过右键单击DbContext来解析依赖项。 CodeLens提出了几个选项:

我们选择添加实体框架核心包。

依赖项将自动添加到项目中。

  1. 我们使用CodeLens以相同的方式解析其他依赖项:

  1. 接下来,我们通过右键单击Controllers目录并在上下文菜单中选择 add New Item,在Controllers目录中添加一个Controller文件:

现在我们选择 MVCController类。

接下来,我们添加前面的代码。

让我们手动添加Microsoft.AspNetCore.Mvc来解析HomeController文件中的Controller依赖项。 我们还可以看到以前通过解析DbContext类添加的Microsoft.EntityFrameworkCore:

在添加了前面的代码之后,我们可以在HomeController类中看到已解析的依赖项。 我们添加了用构造函数注入Index操作方法中使用的CookbookContext类的代码,以检索Book项的列表。

  1. 接下来,我们在前面创建的Index方法对应的Views/Home目录中添加 MVC 视图页面:

  1. 让我们将以下代码添加到Index文件中:

  1. 现在,我们添加一个 JSON 配置文件来添加连接到数据库的连接字符串:

  1. 让我们将以下代码添加到appsetting.json文件中:

  1. 现在让我们打开Startup.cs来修改里面的代码:

  1. 让我们将以下代码添加到Startup.cs文件中:

  1. 接下来,我们解析ConfigurationBuilder依赖:

  1. 我们还解决了SetBasePath方法依赖:

  1. 我们还解决了AddJsonFile方法依赖:

  1. 我们可以看到依赖自动添加到项目中,相应的 NuGet 包在解析后自动下载:

  1. 接下来,我们替换以下代码:

  1. 我们用下面的代码替换它,它注入依赖项,将DbContext配置为注入ConfigureServices方法中的Controller构造函数。 这段代码还将 MVC 中间件添加到配置路由规则的Configure方法中:

  1. 通过添加Microsoft.EntityFrameworkCore.SqlServer包来解决UseSqlServer方法,将 SQL 提供程序添加到实体框架:

  1. 最后,我们启动应用以确保代码正常工作,并且它从 SQL Azure 中正确地检索了Book数据: