c#使用EntityFramework

IDE:VS2019

.Net版本:.Net Core3.1

數據庫:Sqlite

1.創建一個.net core控制檯的項目,並創建兩個model,TeacherModel和StudentModel,其中主程序集引用Models程序集:

2.兩個model都有名字和id等信息:

    public class TeacherModel
    {
        public int ID { set; get; }
        public string Name { set; get; }
    }

    public class StudentModel
    {
        public int ID { set; get; }
        public string Name { set; get; }
    }

3.通過NuGet安裝兩個包。

在Models安裝:

在EntityFrameworkDemo安裝:

4.添加一個Context類:

    public class InfoManagementContext: DbContext
    {
        public DbSet<StudentModel> Students { get; set; }
        public DbSet<TeacherModel> Teachers { get; set; }

        protected override void OnConfiguring(DbContextOptionsBuilder options)
            => options.UseSqlite("Data Source=info.db");
    }

5.進入到程序包管理控制檯界面:

生成項目後執行下面兩個命令:

執行成功後,會生成兩個新內容,info.db和Migrations文件夾下的內容,其中Migrations在上線前一般可以隨意刪除,但是後期會涉及到數據遷移和數據庫更新的問題,不建議刪除,以防出現問題:

6.將info.db做下設置:

7.在Program添加一段測試代碼:

    class Program
    {
        static void Main(string[] args)
        {
            var db = new InfoManagementContext();
            //新增
            db.Teachers.Add(new TeacherModel() { Name = "教師1" });
            db.Students.Add(new StudentModel() { Name = "學生1" });
            db.SaveChanges();//該方法默認情況下會封裝到一個事務裏面
            //讀取
            var teacher = db.Teachers.OrderBy(x => x.ID).First();
            var student = db.Students.OrderBy(x => x.ID).First();
            //修改
            teacher.Name = "教師2";
            student.Name = "學生2";
            db.SaveChanges();
            //讀取
            teacher = db.Teachers.OrderBy(x => x.ID).First();
            student = db.Students.OrderBy(x => x.ID).First();
            //刪除
            db.Teachers.Remove(teacher);
            db.Students.Remove(student);
            db.SaveChanges();
        }
    }

8.生成代碼並執行,使用sqlite工具觀察數據庫的info.db這個數據庫的變化:

我用的sqlite工具是SQLiteStudio。

基本的使用流程大概就是如此,這裏Migrations這個文件夾在生成了數據庫之後是可以刪除的。

有三個問題,需要解決:

1.主鍵問題,有單一主鍵和複合主鍵

單一主鍵只需要在屬性上加特性[Key]或者重寫DbContext就可以了:

    public class InfoManagementContext: DbContext
    {
        public DbSet<StudentModel> Students { get; set; }
        public DbSet<TeacherModel> Teachers { get; set; }

        protected override void OnConfiguring(DbContextOptionsBuilder options)
            => options.UseSqlite("Data Source=info.db");

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<StudentModel>().HasKey(x => new { x.Key });
            base.OnModelCreating(modelBuilder);
        }
    }

    或者

    public class StudentModel
    {
        [Key]
        public int Key { set; get; }
        public int ID { set; get; }
        public string Name { set; get; }
        public int TeacherID { set; get; }
    }

複合主鍵,則只能在重寫OnModelCreating裏面添加:

modelBuilder.Entity<StudentModel>().HasKey(x => new { x.Key, x.ID });

2.將不同的表放到不同的數據庫裏面。這個例子裏面兩張表都放到了一個庫裏面,如果有分庫的需求,那麼就多寫一個DbContext,然後分別指定Context執行生成庫操作:

Add-Migration InitialCreate -Context InfoManagementContext

Update-Database -Context InfoManagementContext

3.表更新問題。如果要給某張表增加一列,原本的數據不能刪除,解決方法是使用Add-Migration的參數Update-Database,然後執行更新數據庫的命令Update-Database:

文件夾下會多一個更新數據庫的類:

這樣,數據庫就更新了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章