在 ASP.NET Core 中使用 SQL

由 吾有佳卿 创建, 最后一次修改 2019-04-15

MvcMovieContext 对象处理连接到数据库并将 Movie 对象映射到数据库记录的任务。 在 Startup.cs 文件的 ConfigureServices 方法中向依赖关系注入容器注册数据库上下文:

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 配置系统会读取 ConnectionString。 为了进行本地开发,它会从 appsettings.json 文件获取连接字符串:

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

将应用部署到测试或生产服务器时,可使用环境变量或另一种方法将连接字符串设置为实际的 SQL Server。 有关详细信息,请参阅配置

SQL Server Express LocalDB

LocalDB 是轻型版的 SQL Server Express 数据库引擎,以程序开发为目标。 LocalDB 作为按需启动并在用户模式下运行的轻量级数据库没有复杂的配置。 默认情况下,LocalDB 数据库在 C:/Users/{user} 目录中创建 .mdf 文件。

  • 从“视图”菜单中,打开“SQL Server 对象资源管理器”(SSOX)。

    “视图”菜单

  • 右键单击 Movie 表,然后单击“视图设计器”

    Movie 表上打开的上下文菜单

    设计器中打开的 Movie 表

请注意 ID 旁边的密钥图标。 默认情况下,EF 将名为 ID 的属性设置为主键。

  • 右键单击 Movie 表,然后单击“查看数据”

    Movie 表上打开的上下文菜单

    显示表数据的打开的 Movie 表

设定数据库种子

在 Models 文件夹中创建一个名为 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 中没有任何电影,则会返回种子初始值设定项,并且不会添加任何电影。

C#

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

添加种子初始值设定项

将 Program.cs 的内容替换为以下代码:

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>();
    }
}

测试应用

  • 删除 DB 中的所有记录。 可以使用浏览器中的删除链接,也可从 SSOX 执行此操作。

  • 强制应用初始化(调用 Startup 类中的方法),使种子方法能够正常运行。 若要强制进行初始化,必须先停止 IIS Express,然后再重新启动它。 可以使用以下任一方法来执行此操作:

    • 右键单击通知区域中的 IIS Express 系统任务栏图标,然后点击“退出”或“停止站点”

      IIS Express 系统任务栏图标

      上下文菜单

      • 如果是在非调试模式下运行 VS 的,请按 F5 以在调试模式下运行
      • 如果是在调试模式下运行 VS 的,请停止调试程序并按 F5

应用将显示设定为种子的数据。

在 Microsoft Edge 中打开的显示电影数据的 MVC 电影应用程序



以上内容是否对您有帮助:
二维码
建议反馈
二维码