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

 

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM