zoukankan      html  css  js  c++  java
  • 在.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();
    }

      

  • 相关阅读:
    实现类莫名的错误解决
    xml文件不识别dubbo标签,添加支持的方法
    不要粗心马虎,不然你要付出几倍的精力纠错
    redis 缓存功能摘要
    spring的maven工程(服务层和表现层分离)配置浅析
    暂时放弃dubbo
    Maven工程的JDK版本配置
    spring的SOA聚合工程应用框架的搭建
    阿里云用宝塔面板安装JDK、zookeeper、dubbo
    maven项目不能正常运行
  • 原文地址:https://www.cnblogs.com/HTLucky/p/11677723.html
Copyright © 2011-2022 走看看