Jaa


Pika-aloitus: .NET Aspire -sovelluksen yhdistäminen SQL-tietokantaan

Koskee Microsoft Fabricin SQL-tietokantaa

Tässä opetusohjelmassa opit yhdistämään .NET Aspire -sovelluksesi SQL-tietokantaan Microsoft Fabricissa (esikatselu).

Fabricin SQL-tietokannan avulla voit yhdistää sovelluksesi nopeasti. Tässä artikkelissa yhdistät .NET Aspire -sovelluksen Fabricin SQL-tietokantaan mallirakenteen avulla AdventureWorksLT . Tässä opastuksessa käytetään Visual Studio Codea, jonka avulla voit yhdessä Fabricin kokeilukapasiteetin kanssa suorittaa koko vaiheittaisen vaiheen maksutta.

Prerequisites

Lisää uusi sivu AdventureWorks-tuotetietojen näyttämistä varten

Pika-aloitus: Luo ensimmäinen .NET Aspire -ratkaisu luo uuden .NET Aspire -ratkaisun, jossa on ohjelmointirajapinta ja verkkoedusta. Ratkaisu sisältää seuraavat projektit:

  • AspireSample.ApiService: Web API -projekti, joka näyttää sääennusteet.
  • AspireSample.AppHost: Orkestrointiprojekti, joka yhdistää ja määrittää sovelluksesi eri projektit ja palvelut. Määritä orkestraattori käynnistysprojektiksi.
  • AspireSample.ServiceDefaults: Jaettu luokkakirjasto, joka sisältää uudelleenkäytettäviä määrityksiä ratkaisusi projekteissa.
  • AspireSample.Web: Blazor-sovellus, joka tarjoaa ratkaisun käyttöliittymän.

Tietokantamallin ja kontekstiluokkien luominen

Asenna ensin EF Core projektiin AspireSample.ApiService .

  1. Siirry AspireSample.ApiService Visual Studio Coden pääteikkunassa projektihakemistoon ja suorita sitten:

    dotnet add package Aspire.Microsoft.EntityFrameworkCore.SqlServer
    
  2. Jos haluat edustaa tuotetta, lisää projektin juureen AspireSample.ApiService uusi tiedosto, jonka nimi on Product.cs seuraavalla Product malliluokalla:

    using Microsoft.EntityFrameworkCore;
    using System.ComponentModel.DataAnnotations;
    using System.ComponentModel.DataAnnotations.Schema;
    
    namespace AspireSample.ApiService;
    
    [Table("Product", Schema = "SalesLT")]
    public sealed class Product
    {
      public int ProductID { get; set; }
      [Required]
      public string? Name { get; set; }
      public string ProductNumber { get; set; } = string.Empty;
      public string? Color { get; set; }
      [Precision(18, 2)]
      public decimal StandardCost { get; set; } = 0.0m;
      [Precision(18, 2)]
      public decimal ListPrice { get; set; } = 0.0m;
      public string? Size { get; set; }
      [Precision(8, 2)]
      public decimal? Weight { get; set; }
      public int? ProductCategoryID { get; set; }
      public int? ProductModelID { get; set; }
      public DateTime SellStartDate { get; set; } = DateTime.Now;
      public DateTime? SellEndDate { get; set; }
      public DateTime? DiscontinuedDate { get; set; }
      public byte[]? ThumbNailPhoto { get; set; }
      public string? ThumbnailPhotoFileName { get; set; }
      public Guid RowGuid { get; set; } = Guid.NewGuid();
      public DateTime ModifiedDate { get; set; } = DateTime.Now;
    }
    
  3. Lisää uusi tiedosto, jonka nimi on AdventureWorksDbContext.cs seuraavalla AdventureWorksDbContext tietokontekstiluokalla projektin juureen AspireSample.ApiService . Luokkaa käytetään System.Data.Entity.DbContext EF Coren kanssa työskentelyyn ja tietokantasi edustamiseen.

    using System.ComponentModel.DataAnnotations.Schema;
    using Microsoft.EntityFrameworkCore;
    using Microsoft.Extensions.Options;
    
    namespace AspireSample.ApiService;
    
    public class AdventureWorksDbContext(DbContextOptions options) : DbContext(options)
    {
      public DbSet<Product> Products => Set<Product>();
    }
    
  4. Tallenna muutokset valitsemalla Tiedosto>Tallenna kaikki.

Scalar-käyttöliittymän lisääminen API-projektiin

Käytä skalaarikäyttöliittymää projektin testaamiseen AspireSample.ApiService . Asennetaan ja määritetään se:

  1. Siirry AspireSample.ApiService Visual Studio Coden Pääte-ikkunassa projektihakemistoon ja suorita sitten:

    dotnet add package Scalar.AspNetCore
    
  2. Avaa Program.cs tiedosto projektissaAspireSample.ApiService.

  3. Lisää seuraava koodirivi tiedoston alkuun:

    using Scalar.AspNetCore;
    
  4. Etsi seuraavat koodirivit:

    if (app.Environment.IsDevelopment())
    {
      app.MapOpenApi();
    }
    
  5. Muokkaa koodia vastaamaan seuraavia rivejä:

    if (app.Environment.IsDevelopment())
    {
      app.MapOpenApi();
      app.MapScalarApiReference(_ => _.Servers = [ ]);
    }
    
  6. Tallenna muutokset valitsemalla Tiedosto>Tallenna kaikki.

Yhteysmerkkijonon määrittäminen sovelluksen isäntäprojektissa

Yleensä, kun luot pilvipohjaisen ratkaisun .NET Aspiren avulla, kutsut menetelmää Aspire.Hosting.SqlServerBuilderExtensions.AddSqlServer käynnistääksesi säilön, joka suorittaa SQL Server -esiintymän. Välität kyseisen resurssin ratkaisun muille projekteille, jotka tarvitsevat tietokannan käyttöoikeuden.

Tässä tapauksessa haluat kuitenkin käsitellä aiemmin luotua SQL-tietokantaa Fabricissa. App Host -projektissa on kolme eroa:

  • Sinun ei tarvitse asentaa isännöintiintegraatiota Aspire.Hosting.SqlServer .
  • Lisäät yhteysmerkkijonon määritystiedostoon, kuten appsetting.json.
  • Kutsut Aspire.Hosting.ParameterResourceBuilderExtensions.AddConnectionString luodaksesi resurssin, jonka välität muihin projekteihin. Nämä projektit käyttävät tätä resurssia muodostaakseen yhteyden olemassa olevaan tietokantaan.

Toteutetaan tämä kokoonpano:

  1. Avaa appsetting.json tiedosto Visual Studio Codessa AspireSample.AppHost projektissa.

  2. Korvaa tiedoston koko sisältö seuraavalla koodilla:

    {
      "ConnectionStrings": {
          "sql": "sql_connection_string"
      },
      "Logging": {
          "LogLevel": {
              "Default": "Information",
              "Microsoft.AspNetCore": "Warning",
              "Aspire.Hosting.Dcp": "Warning"
          }
      }
    }
    
  3. Siirry selaimessa SQL-tietokantaan, joka on ladattu AdventureWorks-mallitiedoilla.

  4. Valitse asetuskuvake, valitse sitten Yhteysmerkkijonot ja kopioi koko ADO.NET yhteysmerkkijono.

  5. Korvaa sql_connection_stringappsetting.json tiedoston teksti ADO.NET juuri kopioimallasi yhteysmerkkijonolla.

  6. Avaa AppHost.cs tiedosto projektissaAspireSample.AppHost.

  7. Etsi seuraava koodirivi:

    var builder = DistributedApplication.CreateBuilder(args);
    
  8. Lisää heti rivin jälkeen tämä koodirivi, joka hakee yhteysmerkkijonon määritystiedostosta:

    var connectionString = builder.AddConnectionString("sql");
    
  9. Etsi seuraava koodirivi, joka luo resurssin projektille AspireSample.ApiService :

    var apiService = builder.AddProject<Projects.AspireSample_ApiService>("apiservice")
        .WithHttpHealthCheck("/health");
    
  10. Muokkaa riviä vastaamaan seuraavaa koodia, joka luo resurssin ja välittää yhteysmerkkijonon sille:

    var apiService = builder.AddProject<Projects.AspireSample_ApiService>("apiservice")
        .WithHttpHealthCheck("/health")
        .WithReference(connectionString);
    
  11. Tallenna muutokset valitsemalla Tiedosto>Tallenna kaikki.

Käytä tietokantaa API-projektissa

Kun palaat projektiin AspireSample.ApiService , sinun on hankittava yhteysmerkkijonoresurssi App Hostilta ja luotava sitten tietokanta sen avulla:

  1. Avaa Program.cs tiedosto projektissaAspireSample.ApiService.

  2. Lisää seuraava koodirivi tiedoston alkuun:

    using AspireSample.ApiService;
    
  3. Etsi seuraava koodirivi:

    var builder = WebApplication.CreateBuilder(args);
    
  4. Lisää heti rivin jälkeen tämä koodirivi:

    builder.AddSqlServerDbContext<AdventureWorksDbContext>("sql");
    
  5. Etsi seuraava koodirivi:

    app.MapDefaultEndpoints();
    
  6. Lisää heti rivin jälkeen seuraavat koodirivit:

    app.UseExceptionHandler("/Error", createScopeForErrors: true);
    app.UseHsts();
    
  7. Tallenna muutokset valitsemalla Tiedosto>Tallenna kaikki.

Koodin lisääminen tuotteiden kyselyyn tietokannasta

.NET Aspire -aloitusratkaisumallissa ohjelmointirajapinta luo viisi satunnaista sääennustetta ja palauttaa ne, kun toinen projekti pyytää niitä. Lisätään koodi, joka kyselee tietokantaa:

  1. Avaa Program.cs tiedosto projektissaAspireSample.ApiService.

  2. Lisää tiedoston yläreunaan seuraavat koodirivit:

    using Microsoft.AspNetCore.Mvc;
    using Microsoft.EntityFrameworkCore;
    
  3. Etsi seuraava koodi:

    string[] summaries = ["Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"];
    
    app.MapGet("/weatherforecast", () =>
    {
        var forecast = Enumerable.Range(1, 5).Select(index =>
            new WeatherForecast
            (
                DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
                Random.Shared.Next(-20, 55),
                summaries[Random.Shared.Next(summaries.Length)]
            ))
            .ToArray();
        return forecast;
    })
    .WithName("GetWeatherForecast");
    
  4. Lisää heti koodin jälkeen seuraavat rivit:

    app.MapGet("/productList", async ([FromServices] AdventureWorksDbContext context) =>
    {
        var product = await context.Products.OrderBy(p=>p.ProductID).ToArrayAsync();
        return product;
    })
    .WithName("GetProductList");
    
  5. Tallenna muutokset valitsemalla Tiedosto>Tallenna kaikki.

Lisää koodi tietokannan tuotteiden näyttämiseen

.NET Aspire -aloitusratkaisumallissa verkkoprojekti sisältää muutaman esimerkkisivun. Lisätään toinen sivu, jolla näytetään tuotetiedot tietokannasta:

  1. Avaa AspireSample.Web.csproj tiedosto projektissaAspireSample.Web.

  2. Etsi seuraava koodi:

    <ItemGroup>
       <ProjectReference Include="..\AspireSample.ServiceDefaults\AspireSample.ServiceDefaults.csproj" />
    </ItemGroup>
    
  3. Lisää projektiviite esimerkiksi seuraaville AspireSample.ApiServer:

    <ItemGroup>
       <ProjectReference Include="..\AspireSample.ServiceDefaults\AspireSample.ServiceDefaults.csproj" />
       <ProjectReference Include="..\AspireSample.ApiService\AspireSample.ApiService.csproj" /> 
     </ItemGroup>
    
  4. Jos haluat noutaa tuotetietueet, lisää uusi tiedosto, jonka nimi ProductApiClient.cs on seuraavalla ProductApiClient luokalla projektin juureen AspireSample.Web :

    using AspireSample.ApiService;
    
    namespace AspireSample.Web;
    
    public class ProductApiClient(HttpClient httpClient)
    {
        public async Task<Product[]> GetProductAsync(int maxItems = 300, CancellationToken cancellationToken = default)
        {
            List<Product>? products = null;
    
            await foreach (var product in httpClient.GetFromJsonAsAsyncEnumerable<Product>("/productList", cancellationToken))
            {
                if (products?.Count >= maxItems)
                {
                    break;
                }
                if (product is not null)
                {
                    products ??= [];
                    products.Add(product);
                }
            }
    
            return products?.ToArray() ?? [];
        }
    }
    
  5. Avaa Program.cs tiedosto projektissaAspireSample.Web.

  6. Etsi seuraava koodi:

     builder.Services.AddHttpClient<WeatherApiClient>(client =>
     {
         // This URL uses "https+http://" to indicate HTTPS is preferred over HTTP.
         // Learn more about service discovery scheme resolution at https://aka.ms/dotnet/sdschemes.
         client.BaseAddress = new("https+http://apiservice");
     });
    
  7. Lisää heti koodin jälkeen seuraavat rivit:

     builder.Services.AddHttpClient<ProductApiClient>(client =>
     {
         // This URL uses "https+http://" to indicate HTTPS is preferred over HTTP.
         // Learn more about service discovery scheme resolution at https://aka.ms/dotnet/sdschemes.
         client.BaseAddress = new("https+http://apiservice");
     });
    
  8. Laajenna projektissa AspireSample.WebKomponenttisivut-kansio>. Luo uusi tiedosto Pages-kansioon nimeltä Products.razor ja liitä siihen seuraava koodi:

    @using AspireSample.ApiService;
    @using Microsoft.AspNetCore.Components.Web
    @page "/products"
    @attribute [StreamRendering(true)]
    @attribute [OutputCache(Duration = 5)]
    
    @inject ProductApiClient ProductApi
    
    <PageTitle>Products</PageTitle>
    
    <h1>Products</h1>
    
    <p>This component demonstrates showing data loaded from a backend API service that reads data from a database.</p>
    
    @if (products == null)
    {
      <p><em>Loading...</em></p>
    }
    else
    {
      <table class="table">
          <thead>
              <tr>
                  <th>Thumbnail</th>
                  <th>ProductID</th>
                  <th>Name</th>
                  <th>ProductNumber</th>
                  <th>Color</th>
                  <th>StandardCost</th>
                  <th>ListPrice</th>
                  <th>Size</th>
                  <th>Weight</th>
                  <th>ProductCategoryID</th>
                  <th>ProductModelID</th>
                  <th>SellStartDate</th>
                  <th>SellEndDate</th>
                  <th>DiscontinuedDate</th>
                  <th>ThumbnailPhotoFileName</th>
                  <th>RowGuid</th>
                  <th>ModifiedDate</th>
              </tr>
          </thead>
          <tbody>
              @foreach (var product in products)
              {
                  <tr>
                      <td><img src="@GetImageString(product.ThumbNailPhoto)"/></td>
                      <td>@product.ProductID</td>
                      <td>@product.Name</td>
                      <td>@product.ProductNumber</td>
                      <td>@product.Color</td>
                      <td>@product.StandardCost</td>
                      <td>@product.ListPrice</td>
                      <td>@product.Size</td>
                      <td>@product.Weight</td>
                      <td>@product.ProductCategoryID</td>
                      <td>@product.ProductModelID</td>
                      <td>@product.SellStartDate.ToShortDateString()</td>
                      <td>@(product.SellEndDate?.ToShortDateString() ?? "N/A")</td>
                      <td>@(product.DiscontinuedDate?.ToShortDateString() ?? "N/A")</td>
                      <td>@product.ThumbnailPhotoFileName</td>
                      <td>@product.RowGuid</td>
                      <td>@product.ModifiedDate.ToShortDateString()</td>
                  </tr>
              }
          </tbody>
      </table>
    }
    
    @code {
    
      private Product[]? products;
    
      protected override async Task OnInitializedAsync()
      {
          products = await ProductApi.GetProductAsync();
      }
    
      private string GetImageString(byte[]? imageData)
      {
          if (imageData == null || imageData.Length == 0)
          {
              return "";
          }
          //It is almost always better to store images and files outside of the database.
          return String.Concat("data:image/png;base64,", Convert.ToBase64String(imageData, 0, imageData.Length));
      }
    }
    
  9. Laajenna projektissa AspireSample.WebKomponenttien>asettelu -kansio.

  10. Avaa NavMenu.razor.

  11. Etsi seuraava koodi:

    <div class="nav-item px-3">
      <NavLink class="nav-link" href="weather">
          <span class="bi bi-list-nested" aria-hidden="true"></span> Weather
      </NavLink>
    </div>
    
  12. Lisää heti koodin jälkeen seuraavat rivit:

    <div class="nav-item px-3">
      <NavLink class="nav-link" href="products">
          <span class="bi bi-list-nested" aria-hidden="true"></span> Products
      </NavLink>
    </div>
    
  13. Tallenna muutokset valitsemalla Tiedosto>Tallenna kaikki.

Suorita ja testaa sovellus paikallisesti

Mallisovellus on valmis testattavaksi.

  1. Paina Visual Studio Codessa F5 käynnistääksesi .NET Aspire -projektin koontinäytön selaimessa.

  2. Uusi välilehti avautuu, jossa sinua pyydetään kirjautumaan sisään Azureen. Kehote on todennettava SQL-tietokantaan. Ota tämä sovellus käyttöön käyttämällä palvelun tai käyttäjän määrittämää hallittua käyttäjätunnusta tai palvelun päänimeä. Jos haluat muuttaa todennustyyppiä, päivitä yhteysmerkkijono:

    Salasanaton yhteysmerkkijono määrittää määritysarvoksi Authentication="Active Directory Default", joka ohjaa kirjastoa Microsoft.Data.SqlClient muodostamaan yhteyden Azure SQL Databaseen käyttämällä luokkaa nimeltä DefaultAzureCredential. DefaultAzureCredential ottaa käyttöön salasanattomat yhteydet Azure-palveluihin, ja sen tarjoaa Azure-käyttäjätietokirjasto, josta SQL-asiakaskirjasto on riippuvainen. DefaultAzureCredential Tukee useita todennusmenetelmiä ja määrittää, mitä käytetään ajon aikana eri ympäristöissä.

    Note

    Salasanattomat yhteysmerkkijonot on turvallista sitoa lähteenhallintaan, koska ne eivät sisällä salaisuuksia, kuten käyttäjänimiä, salasanoja tai käyttöoikeusavaimia.

  3. Valitse punainen ympyrä, jossa on numero apiservicen tilan vieressä. Tämä avaa virhelokin, jossa on merkintä aina, kun tietokantayhteys aikakatkaistiin tunnistetietoja odotettaessa.

    Kuvakaappaus Aspire-sovelluksesta, jossa on punainen virheilmoitus.

  4. Valitse selaimen Takaisin-painike palataksesi Resurssit-välilehteen .

  5. Odota, että webfrontendin tilaksi muuttuu Käynnissä. Valitse sitten URL-osoite.

  6. Valitse uusi Tuotteet-sivu siirtymispalkista.

  7. Selaa tuotteita. Joissakin tuotteissa on kuvia, kun taas toisissa näkyy "Ei kuvaa saatavilla" -kuva.

    Kuvakaappaus Aspire-sovelluksen tuoteluettelosta, jossa on erilaisia tuotekuvia.

Lisää ominaisuuksia

Samaa tahtia vain!