ASP.NET CORE 使用 EF CORE訪問數據庫

asp.net core經過ef core來訪問數據庫,這裏用的是代碼優先,經過遷移來同步數據庫與模型。web

環境:vs2017,win10,asp.net core 2.1sql

1、從創建asp.net core web項目開始                                                                                數據庫

一、經過vs2017創建一個asp.net core web應用程序json

二、在models文件夾下面建立一個student類,這個類用做數據模型,表示的是數據庫裏面的student表 windows

public class Student
    {
        [DatabaseGenerated(DatabaseGeneratedOption.None)]
        public Guid ID { set; get; }
        [Required]
        [MaxLength(30)]
        public string Name { set; get; }
        public int Age { set; get; }
        public byte Sex { set; get; }
        public string Remark { set; get; }


        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public DateTime CreateDate { set; get; }
        [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
        public DateTime LastUpdate { set; get; }
    }

 關於表裏面的特性說明這裏暫時無論,等建立了數據庫後再來講明。mvc

三、建立數據庫上下文app

在項目中創建一個Data文件夾,建立一個類SqlServerContextasp.net

public class SqlServerContext : DbContext
    {
        public SqlServerContext(DbContextOptions<SqlServerContext> options)
           : base(options)
        {
        }
        public DbSet<Student> Students { get; set; }
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Student>().ToTable("Student");
        }
    }

在 Entity Framework 中,實體集一般與數據表相對應,具體實體與表中的行相對應。當數據庫建立完成後, EF 建立一系列數據表,表名默認和 DbSet 屬性名相同。但能夠在OnModelCreating方法中指定表名。ide

四、註冊數據庫上下文工具

打開 Startup.cs,在ConfigureServices方法中添加以下代碼

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

SqlServerContext是數據庫字符串的名稱。打開appsettings.json 文件,並如如下示例所示添加鏈接字符串。

"ConnectionStrings": {
    "SqlServerContext": "Server=(localdb)\\ProjectsV84;Database=TestDB1;Trusted_Connection=True;MultipleActiveResultSets=true"
  }

這裏鏈接的是本地數據庫,數據庫的驗證方式是windows驗證。

五、遷移

經過命令行接口 (CLI)執行遷移命令來實現遷移,在此以前,須要按照適用於命令行接口 (CLI) 的 EF 工具。 注意: 必須經過編輯 .csproj 文件來安裝此包;不能使用 install-package 命令或包管理器 GUI。

若要編輯 .csproj 文件,可右鍵單擊解決方案資源管理器中的項目名稱,而後選擇「編輯EFCoreDB.csproj」,在ItemGroup裏面添加以下代碼

    <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.0" />
    <DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="2.0.0" />

在項目所在的文件夾下打開cmd窗口,執行命令:dotnet ef migrations add CreateDB

命令執行成功的話,會在項目中添加一個文件夾Migrations

這裏面的兩個文件就是EF如何建立數據庫的,通常來講不須要手動去修改這兩個文件。

這時候,數據庫裏面尚未相應的數據庫和表

在cmd中執行命令dotnet ef database update,成功執行後,就能夠在數據庫裏面看到建立的數據庫和表了

六、分析

如今來看看student表的列和模型student的關係

系統默認ID是主鍵,這是一種約定,固然也能夠在模型student的ID屬性上用 [Key]來修飾,這時候ID能夠是其餘的名稱。具體有關模型建立的信息,請參考建立並配置模型

模型中,ID的類型是guid,在數據庫裏面就對應類型uniqueidentifier,[DatabaseGenerated(DatabaseGeneratedOption.None)]特性表示ID列不須要數據庫自動添加值。

Name和Remark都是string類型,remark沒有任何修飾,因此數據庫中的類型就是nvarchar(max),且能夠爲空。

七、步驟優化

上面的的6個步驟中,第3,4兩步能夠不用手動添加。能夠經過新搭建基架的項目命令來完成。

先完成上面的1,2兩個步驟,而後在Controllers文件夾上右鍵==》添加==》新搭建基架的項目

在模型類中選擇第二步添加的模型student,數據上下文類中,點擊後面的+號,將名稱改成sqlserver,其餘的默認就行,最後點擊添加。系統會自動的建立數據上下文,而且還幫你註冊了,除此以外,還添加了students控制器和相應的視圖,對於控制器和視圖能夠保留,也能夠刪掉。剩下的須要修改一下配置文件中數據庫的鏈接字符串,而後接着第五步繼續就能夠了。

 

2、當模型修改或者添加新的模型後

一、修改模型student,添加一個學號字段code;添加模型course,每一個學生能夠報多個課程,每一個課程能夠有多個學生報名,所以student和course是多對多的關係,須要一箇中間表來關聯,因此添加模型Enrollment。修改後的模型以下:

 

   public class Student
    {
        [DatabaseGenerated(DatabaseGeneratedOption.None)]
        public Guid ID { set; get; }
        [Required]
        [MaxLength(30)]
        public string Name { set; get; }
        [Required]
        [MaxLength(30)]
        public string Code { set; get; }
        public int Age { set; get; }
        public byte Sex { set; get; }
        public string Remark { set; get; }
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public DateTime CreateDate { set; get; }
        [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
        public DateTime LastUpdate { set; get; }
        public ICollection<Enrollment> Enrollments { get; set; }
    }

    public class Enrollment
    {
     public int EnrollmentID { get; set; }
public int CourseID { get; set; } public Guid StudentID { get; set; } public Grade? Grade { get; set; } public Course Course { get; set; } public Student Student { get; set; } } public enum Grade { A, B, C, D, F } 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; } }

 

修改數據上下文

 public class SqlServerContext : DbContext
    {
        public SqlServerContext(DbContextOptions<SqlServerContext> options)
           : base(options)
        {
        }
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Student>().ToTable("Student");
            modelBuilder.Entity<Course>().ToTable("Course");
            modelBuilder.Entity<Enrollment>().ToTable("Enrollment");

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

    }

二、遷移

執行這個命令後,在Migrations文件夾中添加了20190329030918_AddTable.cs文件,裏面的內容就是關於模型的修改的一些代碼

繼續執行命令dotnet ef database update

完過後,數據庫中表已經正常添加了

經過上面的方式,在student表中添加了列code,新建的表Enrollment中有主鍵和外鍵。固然也能夠不用設置外鍵,直接將表Enrollment的CourseID和StudentID設置爲複合主鍵。這樣的話,模型student中就不須要導航屬性StudentID(Course,Enrollment中也是如此)。同時數據上下文中須要指定Enrollment表的複合主鍵:

modelBuilder.Entity<Enrollment>().ToTable("Enrollment").HasKey(c=>new { c.StudentID,c.CourseID});

這樣一來,Enrollment中的EnrollmentID也要去掉。設置複合主鍵只能是在數據上下文中設置

3、爲數據庫添加初始數據

在數據庫中,有些表是有初始數據的,能夠經過sql語句導入,在這裏經過程序來實現吧

打開Program.cs文件,修改後:

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<SqlServerContext>();
                    Initialize(context);
                }
                catch (Exception ex)
                {
                    var logger = services.GetRequiredService<ILogger<Program>>();
                    logger.LogError(ex, "An error occurred while seeding the database.");
                }
            }


            host.Run();
        }

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

        private static void Initialize(SqlServerContext context)
        {
            if (!context.Courses.Any())
            {
                var courses = new Course[]
                {
                new Course{CourseID=1050,Title="數學",Credits=3},
                new Course{CourseID=4022,Title="語文",Credits=3},
                new Course{CourseID=4041,Title="英語",Credits=3},
                new Course{CourseID=1045,Title="化學",Credits=4},
                new Course{CourseID=3141,Title="生物",Credits=4},
                new Course{CourseID=2021,Title="物理",Credits=3},
                new Course{CourseID=2042,Title="體育",Credits=4}
                };
                    foreach (Course c in courses)
                    {
                        context.Courses.Add(c);
                    }
                    context.SaveChanges();
            }

        }

    }

運行程序,數據就會添加到數據庫了。

4、數據庫表裏面有數據的狀況下修改表結構

 這裏的修改確定是合理的修改,不能說你將字符串的列改爲了數字的列。這裏試驗一下添加新的列,不能爲空的

一、在course模型中,添加一個非空的字段

二、遷移

執行完遷移的第一個命令後,打開系統添加的文件,找到Up方法

能夠看到up方法裏面只有影響修改的部分,要設置一個非空列的初始值,就須要在這裏改代碼了,改好了以後執行遷移的第二個命令。查詢數據庫,表結構已經更改,並且裏面的數據也沒有丟失。

 

 

 關於EF CORE的應用的基本介紹就到這裏,更深刻的學習仍是參考微軟官方文檔

相關文章
相關標籤/搜索