在 ASP.NET Core 中使用 SQL

2019-04-17 08:57 更新

MvcMovieContext 對(duì)象處理連接到數(shù)據(jù)庫(kù)并將 Movie 對(duì)象映射到數(shù)據(jù)庫(kù)記錄的任務(wù)。 在 Startup.cs 文件的 ConfigureServices 方法中向依賴關(guān)系注入容器注冊(cè)數(shù)據(jù)庫(kù)上下文:

C#
public void ConfigureServices(IServiceCollection services)
{
    services.Configure<CookiePolicyOptions>(options =>
    {
        // This lambda determines whether user consent for non-essential cookies 
        // is needed for a given request.
        options.CheckConsentNeeded = context => true;
        options.MinimumSameSitePolicy = SameSiteMode.None;
    });


    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

    services.AddDbContext<MvcMovieContext>(options =>
         options.UseSqlServer(Configuration.GetConnectionString("MvcMovieContext")));
}

ASP.NET Core 配置系統(tǒng)會(huì)讀取 ConnectionString。 為了進(jìn)行本地開(kāi)發(fā),它會(huì)從 appsettings.json 文件獲取連接字符串:

JSON
"ConnectionStrings": {
  "MvcMovieContext": "Server=(localdb)\\mssqllocaldb;Database=MvcMovieContext-2;Trusted_Connection=True;MultipleActiveResultSets=true"
}

將應(yīng)用部署到測(cè)試或生產(chǎn)服務(wù)器時(shí),可使用環(huán)境變量或另一種方法將連接字符串設(shè)置為實(shí)際的 SQL Server。 有關(guān)詳細(xì)信息,請(qǐng)參閱配置。

SQL Server Express LocalDB

LocalDB 是輕型版的 SQL Server Express 數(shù)據(jù)庫(kù)引擎,以程序開(kāi)發(fā)為目標(biāo)。 LocalDB 作為按需啟動(dòng)并在用戶模式下運(yùn)行的輕量級(jí)數(shù)據(jù)庫(kù)沒(méi)有復(fù)雜的配置。 默認(rèn)情況下,LocalDB 數(shù)據(jù)庫(kù)在 C:/Users/{user} 目錄中創(chuàng)建 .mdf 文件。

  • 從“視圖”菜單中,打開(kāi)“SQL Server 對(duì)象資源管理器”(SSOX)。

    “視圖”菜單

  • 右鍵單擊 Movie 表,然后單擊“視圖設(shè)計(jì)器”

    Movie 表上打開(kāi)的上下文菜單

    設(shè)計(jì)器中打開(kāi)的 Movie 表

請(qǐng)注意 ID 旁邊的密鑰圖標(biāo)。 默認(rèn)情況下,EF 將名為 ID 的屬性設(shè)置為主鍵。

  • 右鍵單擊 Movie 表,然后單擊“查看數(shù)據(jù)”

    Movie 表上打開(kāi)的上下文菜單

    顯示表數(shù)據(jù)的打開(kāi)的 Movie 表

設(shè)定數(shù)據(jù)庫(kù)種子

在 Models 文件夾中創(chuàng)建一個(gè)名為 SeedData 的新類。 將生成的代碼替換為以下代碼:

C#

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Linq;

namespace MvcMovie.Models
{
    public static class SeedData
    {
        public static void Initialize(IServiceProvider serviceProvider)
        {
            using (var context = new MvcMovieContext(
                serviceProvider.GetRequiredService<
                    DbContextOptions<MvcMovieContext>>()))
            {
                // Look for any movies.
                if (context.Movie.Any())
                {
                    return;   // DB has been seeded
                }

                context.Movie.AddRange(
                    new Movie
                    {
                        Title = "When Harry Met Sally",
                        ReleaseDate = DateTime.Parse("1989-2-12"),
                        Genre = "Romantic Comedy",
                        Price = 7.99M
                    },

                    new Movie
                    {
                        Title = "Ghostbusters ",
                        ReleaseDate = DateTime.Parse("1984-3-13"),
                        Genre = "Comedy",
                        Price = 8.99M
                    },

                    new Movie
                    {
                        Title = "Ghostbusters 2",
                        ReleaseDate = DateTime.Parse("1986-2-23"),
                        Genre = "Comedy",
                        Price = 9.99M
                    },

                    new Movie
                    {
                        Title = "Rio Bravo",
                        ReleaseDate = DateTime.Parse("1959-4-15"),
                        Genre = "Western",
                        Price = 3.99M
                    }
                );
                context.SaveChanges();
            }
        }
    }
}

如果 DB 中沒(méi)有任何電影,則會(huì)返回種子初始值設(shè)定項(xiàng),并且不會(huì)添加任何電影。

C#

if (context.Movie.Any())
{
    return;   // DB has been seeded.
}

添加種子初始值設(shè)定項(xiàng)

將 Program.cs 的內(nèi)容替換為以下代碼:

C#

using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using System;
using Microsoft.EntityFrameworkCore;
using MvcMovie.Models;
using MvcMovie;

namespace MvcMovie
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var host = CreateWebHostBuilder(args).Build();

            using (var scope = host.Services.CreateScope())
            {
                var services = scope.ServiceProvider;

                try
                {
                    var context = services.GetRequiredService<MvcMovieContext>();
                    context.Database.Migrate();
                    SeedData.Initialize(services);
                }
                catch (Exception ex)
                {
                    var logger = services.GetRequiredService<ILogger<Program>>();
                    logger.LogError(ex, "An error occurred seeding the DB.");
                }
            }

            host.Run();
        }

        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>();
    }
}

測(cè)試應(yīng)用

  • 刪除 DB 中的所有記錄。 可以使用瀏覽器中的刪除鏈接,也可從 SSOX 執(zhí)行此操作。

  • 強(qiáng)制應(yīng)用初始化(調(diào)用 Startup 類中的方法),使種子方法能夠正常運(yùn)行。 若要強(qiáng)制進(jìn)行初始化,必須先停止 IIS Express,然后再重新啟動(dòng)它。 可以使用以下任一方法來(lái)執(zhí)行此操作:

    • 右鍵單擊通知區(qū)域中的 IIS Express 系統(tǒng)任務(wù)欄圖標(biāo),然后點(diǎn)擊“退出”或“停止站點(diǎn)”

      IIS Express 系統(tǒng)任務(wù)欄圖標(biāo)

      上下文菜單

      • 如果是在非調(diào)試模式下運(yùn)行 VS 的,請(qǐng)按 F5 以在調(diào)試模式下運(yùn)行
      • 如果是在調(diào)試模式下運(yùn)行 VS 的,請(qǐng)停止調(diào)試程序并按 F5

應(yīng)用將顯示設(shè)定為種子的數(shù)據(jù)。

在 Microsoft Edge 中打開(kāi)的顯示電影數(shù)據(jù)的 MVC 電影應(yīng)用程序



以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)