在.net core中数据操作的两种方式(Db first && Code first)

在开发过程中我们通常使用的是Db first这种模式,而在.net core 中推荐使用的却是 code first 反正我是很不习惯这种开发模式

于是就搜寻整个微软的官方文档,终于找到了有关.net core 使用Db first 的教程,这里给出链接:https://docs.microsoft.com/zh-cn/ef/core/miscellaneous/cli/powershell

一.Db first

  1.使用Db first 需要通过Nuget引用几个依赖包

         Microsoft.EntityFrameworkCore

      Microsoft.EntityFrameworkCore.Tools

      Microsoft.EntityFrameworkCore.SqlServer.Design        

 

  2.打开程序管理控制台

    

 

 

  3.执行创建实体类的命令

    Scaffold-DbContext -Connection "Server=.;Database=Company;uid=sa;pwd=123@qwe" Microsoft.EntityFrameworkCore.SqlServer -OutputDir "Models"

     其中   --OutputDir <String >   要在其中放置文件的目录。 路径相对于项目目录。

        -Connection <String>   要在其中放置文件的目录。 路径相对于项目目录。

        -ContextDir <String >   要在其中放置 DbContext 文件的目录。 路径相对于项目目录。

        -Context <String>    名称DbContext类生成。

        -Tables <String[]>    要为其生成实体类型的表。 如果省略此参数,则包括所有表。

     当然我们也可以只生成选定的表,以及指定dbcontext上下文的路径和名称

Scaffold-DbContext "Server=.;Database=Company;uid=sa;pwd=123@qwe" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models -Tables "Blog","Post" -ContextDir Context -Context BlogContext

   当对表有修改时,我们可以通过-Force 参数重新生成实体类

Scaffold-DbContext "Server=.;Database=Company;uid=sa;pwd=123@qwe" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models -Tables "Blog","Post" -ContextDir Context -Context BlogContext -Force

 

  通过添加测试模型遇到的问题

      

 

     解决方案:

      在项目的Startup.cs的ConfigureServices方法中注册生成的上下文

        

 

 二.Code first(这种方式在官方文档中有很多例子,在这里我借用官方文档的实例来简单介绍一下操作步骤)

    1.通过Nuget安装依赖包

      Microsoft.EntityFrameworkCore 

      2.创建实体类

      在 Models 文件夹中,创建 Enrollment.csCourse.cs并且用以下代码替换现有代码:

namespace ContosoUniversity.Models
{
    public enum Grade
    {
        A, B, C, D, F
    }

    public class Enrollment
    {
        public int EnrollmentID { get; set; }
        public int CourseID { get; set; }
        public int StudentID { get; set; }
        public Grade? Grade { get; set; }

        public Course Course { get; set; }
        public Student Student { get; set; }
    }
}

using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;

namespace ContosoUniversity.Models
{
    public class Course
    {
        [DatabaseGenerated(DatabaseGeneratedOption.None)]
        public int CourseID { get; set; }
        public string Title { get; set; }
        public int Credits { get; set; }

        public ICollection<Enrollment> Enrollments { get; set; }
    }
}  

     3.创建数据库上下文

      在项目文件夹中,创建名为的文件夹 Data

      在 Data 文件夹创建名为 SchoolContext.cs 的类文件,并将模板代码替换为以下代码:

using ContosoUniversity.Models;
using Microsoft.EntityFrameworkCore;

namespace ContosoUniversity.Data
{
    public class SchoolContext : DbContext
    {
        public SchoolContext(DbContextOptions<SchoolContext> options) : base(options)
        {
        }

        public DbSet<Course> Courses { get; set; }
        public DbSet<Enrollment> Enrollments { get; set; }
        public DbSet<Student> Students { get; set; }
    }
}

    4.注册 SchoolContext

      ASP.NET Core 默认实现 依赖注入在应用程序启动过程通过依赖注入注册相关服务 (例如 EF 数据库上下文)。 需要这些服务的组件 (如 MVC 控制器) 可以通过向构造函数添加相关参数来获得对应服务。 在本教程后面你将看到控制器构造函数的代      码,就是通过上述方式获得上下文实例。

      若要将 SchoolContext 注册为一种服务,打开 Startup.cs ,并将高亮代码添加到 ConfigureServices 方法中。

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<CookiePolicyOptions>(options =>
    {
        options.CheckConsentNeeded = context => true;
        options.MinimumSameSitePolicy = SameSiteMode.None;
    });

     services.AddDbContext<SchoolContext>(options =>
        options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

    services.AddMvc();
}

    打开 appsettings.json 文件,并如以下示例所示添加连接字符串 。

{
  "ConnectionStrings": {
    "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=ContosoUniversity1;Trusted_Connection=True;MultipleActiveResultSets=true"
  },
"Logging": { "IncludeScopes": false, "LogLevel": { "Default": "Warning" } } }

     5.添加数据

      Program.cs,修改 Main 方法,使得在应用程序启动时能执行以下操作:   

        从依赖注入容器中获取数据库上下文实例。

  

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<SchoolContext>();
             var courses = new Course[]
            {
            new Course{CourseID=1050,Title="Chemistry",Credits=3},
            new Course{CourseID=4022,Title="Microeconomics",Credits=3},
            new Course{CourseID=4041,Title="Macroeconomics",Credits=3},
            new Course{CourseID=1045,Title="Calculus",Credits=4},
            new Course{CourseID=3141,Title="Trigonometry",Credits=4},
            new Course{CourseID=2021,Title="Composition",Credits=3},
            new Course{CourseID=2042,Title="Literature",Credits=4}
            };
            foreach (Course c in courses)
            {
                context.Courses.Add(c);
            }
            context.SaveChanges();
        }
        catch (Exception ex)
        {
            var logger = services.GetRequiredService<ILogger<Program>>();
            logger.LogError(ex, "An error occurred while seeding the database.");
        }
    }

    host.Run();
}

 

 

  

posted @ 2019-10-15 15:01  hello-*-world  阅读(1865)  评论(0编辑  收藏  举报